IE6_MAXMIX.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. @if (@_win32 && @_jscript_version>4)
  2. var minmax_elements;
  3. minmax_props= new Array(
  4. new Array('min-width', 'minWidth'),
  5. new Array('max-width', 'maxWidth'),
  6. new Array('min-height','minHeight'),
  7. new Array('max-height','maxHeight')
  8. );
  9. // Binding. Called on all new elements. If <body>, initialise; check all
  10. // elements for minmax properties
  11. function minmax_bind(el) {
  12. var i, em, ms;
  13. var st= el.style, cs= el.currentStyle;
  14. if (minmax_elements==window.undefined) {
  15. // initialise when body element has turned up, but only on IE
  16. if (!document.body || !document.body.currentStyle) return;
  17. minmax_elements= new Array();
  18. window.attachEvent('onresize', minmax_delayout);
  19. // make font size listener
  20. em= document.createElement('div');
  21. em.setAttribute('id', 'minmax_em');
  22. em.style.position= 'absolute'; em.style.visibility= 'hidden';
  23. em.style.fontSize= 'xx-large'; em.style.height= '5em';
  24. em.style.top='-5em'; em.style.left= '0';
  25. if (em.style.setExpression) {
  26. em.style.setExpression('width', 'minmax_checkFont()');
  27. document.body.insertBefore(em, document.body.firstChild);
  28. }
  29. }
  30. // transform hyphenated properties the browser has not caught to camelCase
  31. for (i= minmax_props.length; i-->0;)
  32. if (cs[minmax_props[i][0]])
  33. st[minmax_props[i][1]]= cs[minmax_props[i][0]];
  34. // add element with properties to list, store optimal size values
  35. for (i= minmax_props.length; i-->0;) {
  36. ms= cs[minmax_props[i][1]];
  37. if (ms && ms!='auto' && ms!='none' && ms!='0' && ms!='') {
  38. st.minmaxWidth= cs.width; st.minmaxHeight= cs.height;
  39. minmax_elements[minmax_elements.length]= el;
  40. // will need a layout later
  41. minmax_delayout();
  42. break;
  43. } }
  44. }
  45. // check for font size changes
  46. var minmax_fontsize= 0;
  47. function minmax_checkFont() {
  48. var fs= document.getElementById('minmax_em').offsetHeight;
  49. if (minmax_fontsize!=fs && minmax_fontsize!=0)
  50. minmax_delayout();
  51. minmax_fontsize= fs;
  52. return '5em';
  53. }
  54. // Layout. Called after window and font size-change. Go through elements we
  55. // picked out earlier and set their size to the minimum, maximum and optimum,
  56. // choosing whichever is appropriate
  57. // Request re-layout at next available moment
  58. var minmax_delaying= false;
  59. function minmax_delayout() {
  60. if (minmax_delaying) return;
  61. minmax_delaying= true;
  62. window.setTimeout(minmax_layout, 0);
  63. }
  64. function minmax_stopdelaying() {
  65. minmax_delaying= false;
  66. }
  67. function minmax_layout() {
  68. window.setTimeout(minmax_stopdelaying, 100);
  69. var i, el, st, cs, optimal, inrange;
  70. for (i= minmax_elements.length; i-->0;) {
  71. el= minmax_elements[i]; st= el.style; cs= el.currentStyle;
  72. // horizontal size bounding
  73. st.width= st.minmaxWidth; optimal= el.offsetWidth;
  74. inrange= true;
  75. if (inrange && cs.minWidth && cs.minWidth!='0' && cs.minWidth!='auto' && cs.minWidth!='') {
  76. st.width= cs.minWidth;
  77. inrange= (el.offsetWidth<optimal);
  78. }
  79. if (inrange && cs.maxWidth && cs.maxWidth!='none' && cs.maxWidth!='auto' && cs.maxWidth!='') {
  80. st.width= cs.maxWidth;
  81. inrange= (el.offsetWidth>optimal);
  82. }
  83. if (inrange) st.width= st.minmaxWidth;
  84. // vertical size bounding
  85. st.height= st.minmaxHeight; optimal= el.offsetHeight;
  86. inrange= true;
  87. if (inrange && cs.minHeight && cs.minHeight!='0' && cs.minHeight!='auto' && cs.minHeight!='') {
  88. st.height= cs.minHeight;
  89. inrange= (el.offsetHeight<optimal);
  90. }
  91. if (inrange && cs.maxHeight && cs.maxHeight!='none' && cs.maxHeight!='auto' && cs.maxHeight!='') {
  92. st.height= cs.maxHeight;
  93. inrange= (el.offsetHeight>optimal);
  94. }
  95. if (inrange) st.height= st.minmaxHeight;
  96. }
  97. }
  98. // Scanning. Check document every so often until it has finished loading. Do
  99. // nothing until <body> arrives, then call main init. Pass any new elements
  100. // found on each scan to be bound
  101. var minmax_SCANDELAY= 500;
  102. function minmax_scan() {
  103. var el;
  104. for (var i= 0; i<document.all.length; i++) {
  105. el= document.all[i];
  106. if (!el.minmax_bound) {
  107. el.minmax_bound= true;
  108. minmax_bind(el);
  109. } }
  110. }
  111. var minmax_scanner;
  112. function minmax_stop() {
  113. window.clearInterval(minmax_scanner);
  114. minmax_scan();
  115. }
  116. minmax_scan();
  117. minmax_scanner= window.setInterval(minmax_scan, minmax_SCANDELAY);
  118. window.attachEvent('onload', minmax_stop);
  119. @end