floating_layer.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. (function (jQuery) {
  2. jQuery.fn.flayer_close = function () {
  3. try {
  4. jQuery(this).flayer.close();
  5. } catch (e) {
  6. fb.error(e);
  7. }
  8. };
  9. jQuery.fn.flayer = function (params) {
  10. var elm = this;
  11. var ref = {};
  12. var customConfig = params;
  13. var config = {
  14. bgcolor: '#333',
  15. opacity: 0.6,
  16. id: 'floating-box',
  17. className: 'floating-box-class',
  18. zIndex: 5000,
  19. beforeStart: function () {},
  20. beforeEnd: function () {},
  21. afterStart: function () {},
  22. close: null,
  23. closeClass: 'close-floating-layer',
  24. outerClose: false,
  25. returnParent: jQuery(elm).parent(),
  26. };
  27. jQuery.fn.flayer.close = function () {
  28. flayer_destroy();
  29. };
  30. function init() {
  31. jQuery.extend(config, customConfig);
  32. }
  33. function start_ovservers() {
  34. jQuery(window).bind('scroll.fl', function () {
  35. setTimeout(function () {
  36. reposition();
  37. }, 5);
  38. });
  39. jQuery(window).bind('resize.fl', function () {
  40. setTimeout(function () {
  41. reposition();
  42. }, 5);
  43. });
  44. jQuery(ref.container).bind('click.fl', function (evt) {
  45. jQuery(evt.target).hasClass(config.closeClass) ? flayer_destroy() : -1;
  46. if (config.outerClose) jQuery(evt.target).hasClass('fl-cloud') ? flayer_destroy() : -1;
  47. });
  48. // todo:
  49. config.outerClose
  50. ? jQuery(window).bind('keypress.fl', function (evt) {
  51. evt.keyCode == 27 ? flayer_destroy() : -1;
  52. })
  53. : -1;
  54. }
  55. function position() {
  56. var viewport = {};
  57. viewport.left = jQuery(window).scrollLeft();
  58. viewport.top = jQuery(window).scrollTop();
  59. viewport.height = window.innerHeight ? window.innerHeight : jQuery(window).height(); //jQuery(document.body).height();
  60. viewport.width = jQuery(window).width(); //jQuery(document.body).width();
  61. var had = jQuery('<div>')
  62. .attr('id', 'truth-is-out-there')
  63. .css({ position: 'absolute', left: '-50000px' });
  64. var dolly = jQuery(elm).clone(true).addClass('dolly');
  65. jQuery(had).append(jQuery(dolly).removeClass('u-hidden'));
  66. jQuery(document.body).prepend(had);
  67. var dims = { width: jQuery(dolly).width(), height: jQuery(dolly).height() };
  68. jQuery(had).remove();
  69. //dims.height = 350;
  70. //dims.width = 350;
  71. jQuery(ref.overlay).height(jQuery(document).height());
  72. jQuery(ref.overlay).width(jQuery(document).width());
  73. jQuery(ref.content).height(dims.height);
  74. jQuery(ref.content).width(dims.width);
  75. jQuery(ref.close).css({ top: viewport.top, left: viewport.left });
  76. jQuery(ref.content).css({
  77. left: Math.round((viewport.width - dims.width) / 2) + viewport.left,
  78. top: Math.round((viewport.height - dims.height) / 2) + viewport.top,
  79. });
  80. }
  81. function reposition() {
  82. var viewport = {};
  83. viewport.left = jQuery(window).scrollLeft();
  84. viewport.top = jQuery(window).scrollTop();
  85. viewport.height = window.innerHeight ? window.innerHeight : jQuery(window).height();
  86. viewport.width = jQuery(window).width();
  87. jQuery(ref.overlay).height(jQuery(document).height());
  88. jQuery(ref.overlay).width(jQuery(document).width());
  89. jQuery(ref.close).css({ top: viewport.top, left: viewport.left });
  90. jQuery(ref.content).css({
  91. left: Math.round((viewport.width - jQuery(elm).width()) / 2) + viewport.left,
  92. top: Math.round((viewport.height - jQuery(elm).height()) / 2) + viewport.top,
  93. });
  94. }
  95. function flayer_destroy() {
  96. config.beforeEnd(elm);
  97. jQuery(window).unbind('scroll.fl');
  98. jQuery(window).unbind('resize.fl');
  99. jQuery(ref.container).unbind('click.fl');
  100. config.outerClose ? jQuery(window).unbind('keypress.fl') : -1;
  101. jQuery(config.returnParent).append(jQuery(elm).addClass('u-hidden'));
  102. jQuery(ref.container).remove();
  103. jQuery.browser.msie && jQuery.browser.version.substr(0, 1) < 7 ? show_selects() : -1;
  104. return true;
  105. }
  106. function embed() {
  107. ref.container = jQuery('<div>');
  108. jQuery(ref.container).addClass(config.className + '-container');
  109. jQuery(ref.container)
  110. .css({
  111. position: 'absolute',
  112. left: '0',
  113. top: '0',
  114. display: 'none',
  115. zIndex: config.zIndex,
  116. })
  117. .addClass('fl-cloud')
  118. .addClass('u-hidden');
  119. ref.overlay = jQuery('<div>').addClass(config.className + '-layer');
  120. jQuery(ref.overlay)
  121. .css({
  122. position: 'absolute',
  123. zIndex: config.zIndex,
  124. backgroundColor: config.bgcolor,
  125. opacity: config.opacity,
  126. zoom: 1,
  127. })
  128. .addClass('fl-cloud');
  129. ref.content = jQuery('<div>').addClass(config.className);
  130. jQuery(ref.content).attr('id', config.id);
  131. jQuery(ref.content)
  132. .css({
  133. position: 'absolute',
  134. zIndex: config.zIndex + 1,
  135. })
  136. .addClass('fl-cloud');
  137. if (null == config.close || typeof config.close == 'undefined') {
  138. ref.close = jQuery('<div>').addClass(config.className);
  139. jQuery(ref.close).attr('id', config.closeClass);
  140. jQuery(ref.close)
  141. .css({
  142. position: 'absolute',
  143. zIndex: config.zIndex + 1,
  144. color: 'white',
  145. cursor: 'pointer',
  146. })
  147. .addClass(config.closeClass);
  148. //jQuery(ref.close).text('[X]Close');
  149. } else {
  150. ref.close = jQuery(config.close).clone().addClass(config.closeClass);
  151. }
  152. jQuery(ref.container).append(ref.overlay);
  153. jQuery(ref.container).append(ref.iframe);
  154. jQuery(ref.container).append(ref.content);
  155. jQuery(ref.container).append(ref.close);
  156. return jQuery(document.body).prepend(ref.container);
  157. }
  158. function hide_selects() {
  159. /*jQuery('select').each(function(index, sb)
  160. {
  161. jQuery(sb).hide();
  162. var dummy = jQuery('<input>');
  163. jQuery(dummy).attr({'type':'text', 'value': jQuery(sb).val()});
  164. jQuery(dummy).addClass('dummy-select-box-ie6');
  165. jQuery(sb).after(dummy);
  166. });*/
  167. }
  168. function show_selects() {
  169. /*jQuery('select').each(function(index, sb)
  170. {
  171. jQuery(sb).show();
  172. jQuery(jQuery(sb).next('.dummy-select-box-ie6')).remove();
  173. });*/
  174. }
  175. function start() {
  176. //jQuery.browser.msie && jQuery.browser.version.substr(0,1)<7 ? hide_selects() : -1;
  177. config.beforeStart(elm);
  178. init();
  179. embed();
  180. position();
  181. jQuery(ref.content).append(jQuery(elm).removeClass('u-hidden'));
  182. start_ovservers();
  183. jQuery(ref.container).removeClass('u-hidden').css({ display: 'block' });
  184. config.afterStart(elm);
  185. }
  186. //
  187. // Entry point
  188. start();
  189. };
  190. })(jQuery);