Index: trunk/core/admin_templates/js/forms.js =================================================================== diff -u -N -r8174 -r8901 --- trunk/core/admin_templates/js/forms.js (.../forms.js) (revision 8174) +++ trunk/core/admin_templates/js/forms.js (.../forms.js) (revision 8901) @@ -42,7 +42,8 @@ Form.Controls = new Array(); Form.Div = false; Form.MinControlsHeight = 0; -Form.Coeffs = new Object(); +Form.Options = new Object(); +Form.FlexibleCount = 0; Form.ScrollerW = 17; Form.ScrollerH = 17; @@ -54,27 +55,42 @@ for (var i in this.Controls) { dim = getDimensions(document.getElementById(this.Controls[i])); - this.MinControlsHeight += dim.innerHeight; -// alert('adding element '+this.Controls[i]+' height: '+dim.innerHeight+' total: '+this.MinControlsHeight) + options = this.Options[this.Controls[i]]; + if (options.height) { // fixed height + options.min_height = options.height; + options.max_height = options.height; + } + if (!options.min_height) options.min_height = dim.innerHeight; + this.MinControlsHeight += options.min_height; + if (dim.innerHeight < options.min_height) { + document.getElementById(this.Controls[i]).style.height = options.min_height+'px'; + } +// alert('adding element '+this.Controls[i]+' height: '+options.min_height+' total: '+this.MinControlsHeight) } + /*alert('one more time'); document.body.style.height = '100%'; document.body.style.overflow = 'hidden'; document.body.scroll = 'no' + alert('done');*/ var a_div = document.createElement('DIV'); a_div.style.position = 'relative'; a_div.style.overflow = 'auto'; a_div.style.width = '100%'; - a_div.style.height = '100%'; +// a_div.style.height = '100%'; +// a_div.style.backgroundColor = 'yellow'; a_div.appendChild(el.parentNode.replaceChild(a_div, el)) this.Table = this.Div.getElementsByTagName('table')[0]; this.Table.style.height = 'auto'; + this.Table.style.width = 'auto'; this.MinHeight = this.Table.offsetHeight; this.MinWidth = this.Table.offsetWidth; +// alert('Measuring min width now') + addEvent(window, 'resize', function() {Form.Resize()}) this.Resize() @@ -90,9 +106,19 @@ } } -Form.addControl = function(id, coeff) { +Form.addControl = function(id, options) { this.Controls.push(id); - this.Coeffs[id] = coeff ? coeff : 1; // for future use + if (!options) { + options = {coeff: 1, max_height: 0, min_height: 0}; + } + else { + if (typeof(options['coeff']) == 'undefined') options['coeff'] = 1; + if (typeof(options['max_height']) == 'undefined') options['max_height'] = 0; + if (typeof(options['min_height']) == 'undefined') options['min_height'] = 0; + } + options['real_height'] = 0; + this.Options[id] = options; // for future use +// print_pre(this.Options[id]); } Form.Resize = function() @@ -101,32 +127,120 @@ var pos = findPos(el); var dim = getDimensions(this.Div); h -= pos[1] + dim.padding[0] + dim.padding[2] + dim.borders[0] + dim.borders[2]; +// alert('h after correction is '+h); var w = (document.all ? window.document.body.offsetWidth : window.innerWidth); w -= pos[0] + dim.padding[1] + dim.padding[3] + dim.borders[1] + dim.borders[3]; - scroller_height = this.MinWidth >= w ? this.ScrollerH : 0; - scroller_width = this.MinHeight >= h - scroller_height ? this.ScrollerW : 0; - scroller_height = this.MinWidth >= w - scroller_width ? this.ScrollerH : 0; + scroller_height = this.MinWidth > w ? this.ScrollerH : 0; + scroller_width = this.MinHeight > h - scroller_height ? this.ScrollerW : 0; + scroller_height = this.MinWidth > w - scroller_width ? this.ScrollerH : 0; + var st = document.getElementById('width_status'); + if (st) st.innerHTML = 'minWdith: '+this.MinWidth+' minHeight: '+this.MinHeight+' w: '+w+' h: '+h+' scroll_w: '+scroller_width+' scroll_h: '+scroller_height; + +// alert('scroller W x H = '+scroller_width+' x '+scroller_height); + // alert('resize: '+w+'x'+h) +// h -= 100; + this.Table.style.width = (w-scroller_width) + 'px'; - this.Div.style.width = (w)+'px'; + this.Div.style.width = (w-scroller_width)+'px'; this.Div.style.height = (h)+'px'; var count = this.Controls.length; // -count here is adjustment - 1px for each control - var split = h - count - this.MinHeight + this.MinControlsHeight; + var split = h - count*2 - this.MinHeight + this.MinControlsHeight; if (split < this.MinControlsHeight) split = this.MinControlsHeight; - var new_height = Math.round(split / count) -2; + this.ResetHeights(); + var used = this.SetMinHeights(); + split -= used; + + var cur_diff = 0; + var iterations = 0; + do { + var prev_diff = cur_diff; + var cur_diff = this.SplitExtra(split); + split = cur_diff; + iterations++; + } while (cur_diff != 0 && cur_diff != prev_diff && iterations < 10); + + for (var i in this.Controls) { + document.getElementById(this.Controls[i]).style.height = this.Options[this.Controls[i]]['real_height'] + 'px'; +// document.getElementById(this.Controls[i]).value = this.Options[this.Controls[i]]['real_height']; + } + // alert('h is: '+h+' min height is '+this.MinHeight+' MinControlsHeight is '+this.MinControlsHeight+' -> '+split+' to split between '+count+' new height is '+new_height); // print_pre(this.Controls) +} + +Form.ResetHeights = function() +{ for (var i in this.Controls) { - document.getElementById(this.Controls[i]).style.height = new_height + 'px'; + var options = this.Options[this.Controls[i]] + options['real_height'] = 0; + options.fixed = false; } + this.FlexibleCount = this.Controls.length; } + + +// Enlarge heights when possible +// Return any not split pixels number +Form.SplitExtra = function(split) +{ + var number = 0; + + for (var i in this.Controls) { + var options = this.Options[this.Controls[i]] + if (options['max_height'] ==0 || options['real_height'] < options.max_height) { + number++; + } + } + + if (number == 0) return 0; + + var delta = Math.floor(split / number); +// alert('splitting '+split+' between '+number+' delta is '+delta) + var added = 0; + for (var i in this.Controls) { + var options = this.Options[this.Controls[i]]; + var to_add; + if (options['max_height'] != 0 && options['real_height']+delta > options['max_height']) { + to_add = options['max_height']-options['real_height']; + } + else { + to_add = delta; + } +// alert('delta: '+delta+' current real: '+options['real_height']+' min: '+options['min_height']+' max:'+options['max_height']+' to_add: '+to_add) + options['real_height'] = options['real_height']+to_add; + added += to_add; + } +// alert('added total '+added) + + // removing extra added from the last (any) control + if (added > split) { + extra = added-split; + options['real_height'] -= extra; + added -= extra; + } + return split - added; +} + +Form.SetMinHeights = function() +{ + var used = 0; + for (var i in this.Controls) { + var options = this.Options[this.Controls[i]] + if (options['real_height'] < options['min_height']) { + options['real_height'] = options.min_height; + used += options.min_height; + } + } + return used; +} \ No newline at end of file