/v2/javascript/boxover.js

http://mightmedia.googlecode.com/ · JavaScript · 372 lines · 327 code · 36 blank · 9 comment · 66 complexity · e24b203b1e46c07b29d4df18f40fbabc MD5 · raw file

  1. /* --- BoxOver ---
  2. /* --- v 2.1 17th June 2006
  3. By Oliver Bryant with help of Matthew Tagg
  4. http://boxover.swazz.org */
  5. if (typeof document.attachEvent!='undefined') {
  6. window.attachEvent('onload',init);
  7. document.attachEvent('onmousemove',moveMouse);
  8. document.attachEvent('onclick',checkMove); }
  9. else {
  10. window.addEventListener('load',init,false);
  11. document.addEventListener('mousemove',moveMouse,false);
  12. document.addEventListener('click',checkMove,false);
  13. }
  14. var oDv=document.createElement("div");
  15. var dvHdr=document.createElement("div");
  16. var dvBdy=document.createElement("div");
  17. var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,boxOpen,totalScrollTop,totalScrollLeft;
  18. boxOpen=false;
  19. ox=10;
  20. oy=10;
  21. lockX=0;
  22. lockY=0;
  23. function init() {
  24. oDv.appendChild(dvHdr);
  25. oDv.appendChild(dvBdy);
  26. oDv.style.position="absolute";
  27. oDv.style.visibility='hidden';
  28. document.body.appendChild(oDv);
  29. }
  30. function defHdrStyle() {
  31. dvHdr.innerHTML='<img style="vertical-align:middle" src="info.gif">&nbsp;&nbsp;'+dvHdr.innerHTML;
  32. dvHdr.style.fontWeight='bold';
  33. dvHdr.style.width='150px';
  34. dvHdr.style.fontFamily='arial';
  35. dvHdr.style.border='1px solid #A5CFE9';
  36. dvHdr.style.padding='3';
  37. dvHdr.style.fontSize='11';
  38. dvHdr.style.color='#4B7A98';
  39. dvHdr.style.background='#D5EBF9';
  40. dvHdr.style.filter='alpha(opacity=85)'; // IE
  41. dvHdr.style.opacity='0.85'; // FF
  42. }
  43. function defBdyStyle() {
  44. dvBdy.style.borderBottom='1px solid #A5CFE9';
  45. dvBdy.style.borderLeft='1px solid #A5CFE9';
  46. dvBdy.style.borderRight='1px solid #A5CFE9';
  47. dvBdy.style.width='150px';
  48. dvBdy.style.fontFamily='arial';
  49. dvBdy.style.fontSize='11';
  50. dvBdy.style.padding='3';
  51. dvBdy.style.color='#1B4966';
  52. dvBdy.style.background='#FFFFFF';
  53. dvBdy.style.filter='alpha(opacity=85)'; // IE
  54. dvBdy.style.opacity='0.85'; // FF
  55. }
  56. function checkElemBO(txt) {
  57. if (!txt || typeof(txt) != 'string') return false;
  58. if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1))
  59. return true;
  60. else
  61. return false;
  62. }
  63. function scanBO(curNode) {
  64. if (checkElemBO(curNode.title)) {
  65. curNode.boHDR=getParam('header',curNode.title);
  66. curNode.boBDY=getParam('body',curNode.title);
  67. curNode.boCSSBDY=getParam('cssbody',curNode.title);
  68. curNode.boCSSHDR=getParam('cssheader',curNode.title);
  69. curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false;
  70. curNode.fixX=parseInt(getParam('fixedrelx',curNode.title));
  71. curNode.fixY=parseInt(getParam('fixedrely',curNode.title));
  72. curNode.absX=parseInt(getParam('fixedabsx',curNode.title));
  73. curNode.absY=parseInt(getParam('fixedabsy',curNode.title));
  74. curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):10;
  75. curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10;
  76. curNode.fade=(getParam('fade',curNode.title)=='on')?true:false;
  77. curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04;
  78. curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0;
  79. if (getParam('requireclick',curNode.title)=='on') {
  80. curNode.requireclick=true;
  81. document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false);
  82. document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false);
  83. }
  84. else {// Note : if requireclick is on the stop clicks are ignored
  85. if (getParam('doubleclickstop',curNode.title)!='off') {
  86. document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false);
  87. }
  88. if (getParam('singleclickstop',curNode.title)=='on') {
  89. document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false);
  90. }
  91. }
  92. curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true;
  93. curNode.title='';
  94. curNode.hasbox=1;
  95. }
  96. else
  97. curNode.hasbox=2;
  98. }
  99. function getParam(param,list) {
  100. var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]');
  101. var res = reg.exec(list);
  102. var returnvar;
  103. if(res)
  104. return res[2].replace('[[','[').replace(']]',']');
  105. else
  106. return '';
  107. }
  108. function Left(elem){
  109. var x=0;
  110. if (elem.calcLeft)
  111. return elem.calcLeft;
  112. var oElem=elem;
  113. while(elem){
  114. if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0))
  115. x+=parseInt(elem.currentStyle.borderLeftWidth);
  116. x+=elem.offsetLeft;
  117. elem=elem.offsetParent;
  118. }
  119. oElem.calcLeft=x;
  120. return x;
  121. }
  122. function Top(elem){
  123. var x=0;
  124. if (elem.calcTop)
  125. return elem.calcTop;
  126. var oElem=elem;
  127. while(elem){
  128. if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0))
  129. x+=parseInt(elem.currentStyle.borderTopWidth);
  130. x+=elem.offsetTop;
  131. elem=elem.offsetParent;
  132. }
  133. oElem.calcTop=x;
  134. return x;
  135. }
  136. var ah,ab;
  137. function applyStyles() {
  138. if(ab)
  139. oDv.removeChild(dvBdy);
  140. if (ah)
  141. oDv.removeChild(dvHdr);
  142. dvHdr=document.createElement("div");
  143. dvBdy=document.createElement("div");
  144. CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle();
  145. CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle();
  146. dvHdr.innerHTML=CBE.boHDR;
  147. dvBdy.innerHTML=CBE.boBDY;
  148. ah=false;
  149. ab=false;
  150. if (CBE.boHDR!='') {
  151. oDv.appendChild(dvHdr);
  152. ah=true;
  153. }
  154. if (CBE.boBDY!=''){
  155. oDv.appendChild(dvBdy);
  156. ab=true;
  157. }
  158. }
  159. var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ;
  160. var ini=false;
  161. // Customised function for inner window dimension
  162. function SHW() {
  163. if (document.body && (document.body.clientWidth !=0)) {
  164. width=document.body.clientWidth;
  165. height=document.body.clientHeight;
  166. }
  167. if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) {
  168. width=document.documentElement.clientWidth;
  169. height=document.documentElement.clientHeight;
  170. }
  171. return [width,height];
  172. }
  173. var ID=null;
  174. function moveMouse(e) {
  175. //boxMove=true;
  176. e?evt=e:evt=event;
  177. CSE=evt.target?evt.target:evt.srcElement;
  178. if (!CSE.hasbox) {
  179. // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement
  180. iElem=CSE;
  181. while ((iElem.parentNode) && (!iElem.hasbox)) {
  182. scanBO(iElem);
  183. iElem=iElem.parentNode;
  184. }
  185. }
  186. if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){
  187. if (!CSE.boxItem) {
  188. iterElem=CSE;
  189. while ((iterElem.hasbox==2)&&(iterElem.parentNode))
  190. iterElem=iterElem.parentNode;
  191. CSE.boxItem=iterElem;
  192. }
  193. iterElem=CSE.boxItem;
  194. if (CSE.boxItem&&(CSE.boxItem.hasbox==1)) {
  195. LBE=CBE;
  196. CBE=iterElem;
  197. if (CBE!=LBE) {
  198. applyStyles();
  199. if (!CBE.requireclick)
  200. if (CBE.fade) {
  201. if (ID!=null)
  202. clearTimeout(ID);
  203. ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay);
  204. }
  205. else {
  206. if (ID!=null)
  207. clearTimeout(ID);
  208. COL=1;
  209. ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay);
  210. }
  211. if (CBE.IEbugfix) {hideSelects();}
  212. fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX;
  213. fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY;
  214. lockX=0;
  215. lockY=0;
  216. boxMove=true;
  217. ox=CBE.offX?CBE.offX:10;
  218. oy=CBE.offY?CBE.offY:10;
  219. }
  220. }
  221. else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove)) {
  222. // The conditional here fixes flickering between tables cells.
  223. if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) {
  224. CBE=null;
  225. if (ID!=null)
  226. clearTimeout(ID);
  227. fadeOut();
  228. showSelects();
  229. }
  230. }
  231. LSE=CSE;
  232. }
  233. else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) {
  234. totalScrollLeft=0;
  235. totalScrollTop=0;
  236. iterElem=CSE;
  237. while(iterElem) {
  238. if(!isNaN(parseInt(iterElem.scrollTop)))
  239. totalScrollTop+=parseInt(iterElem.scrollTop);
  240. if(!isNaN(parseInt(iterElem.scrollLeft)))
  241. totalScrollLeft+=parseInt(iterElem.scrollLeft);
  242. iterElem=iterElem.parentNode;
  243. }
  244. if (CBE!=null) {
  245. boxLeft=Left(CBE)-totalScrollLeft;
  246. boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft;
  247. boxTop=Top(CBE)-totalScrollTop;
  248. boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop;
  249. doCheck();
  250. }
  251. }
  252. if (boxMove&&CBE) {
  253. // This added to alleviate bug in IE6 w.r.t DOCTYPE
  254. bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;
  255. bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft;
  256. mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft;
  257. mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop;
  258. if ((CBE)&&(CBE.windowLock)) {
  259. mouseY < -oy?lockY=-mouseY-oy:lockY=0;
  260. mouseX < -ox?lockX=-mouseX-ox:lockX=0;
  261. mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY;
  262. mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX;
  263. }
  264. oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px";
  265. oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px";
  266. }
  267. }
  268. function doCheck() {
  269. if ( (mouseX < boxLeft) || (mouseX >boxRight) || (mouseY < boxTop) || (mouseY > boxBottom)) {
  270. if (!CBE.requireclick)
  271. fadeOut();
  272. if (CBE.IEbugfix) {showSelects();}
  273. CBE=null;
  274. }
  275. }
  276. function pauseBox(e) {
  277. e?evt=e:evt=event;
  278. boxMove=false;
  279. evt.cancelBubble=true;
  280. }
  281. function showHideBox(e) {
  282. oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden';
  283. }
  284. function hideBox(e) {
  285. oDv.style.visibility='hidden';
  286. }
  287. var COL=0;
  288. var stopfade=false;
  289. function fadeIn(fs) {
  290. ID=null;
  291. COL=0;
  292. oDv.style.visibility='visible';
  293. fadeIn2(fs);
  294. }
  295. function fadeIn2(fs) {
  296. COL=COL+fs;
  297. COL=(COL>1)?1:COL;
  298. oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')';
  299. oDv.style.opacity=COL;
  300. if (COL<1)
  301. setTimeout("fadeIn2("+fs+")",20);
  302. }
  303. function fadeOut() {
  304. oDv.style.visibility='hidden';
  305. }
  306. function isChild(s,d) {
  307. while(s) {
  308. if (s==d)
  309. return true;
  310. s=s.parentNode;
  311. }
  312. return false;
  313. }
  314. var cSrc;
  315. function checkMove(e) {
  316. e?evt=e:evt=event;
  317. cSrc=evt.target?evt.target:evt.srcElement;
  318. if ((!boxMove)&&(!isChild(cSrc,oDv))) {
  319. fadeOut();
  320. if (CBE&&CBE.IEbugfix) {showSelects();}
  321. boxMove=true;
  322. CBE=null;
  323. }
  324. }
  325. function showSelects(){
  326. var elements = document.getElementsByTagName("select");
  327. for (i=0;i< elements.length;i++){
  328. elements[i].style.visibility='visible';
  329. }
  330. }
  331. function hideSelects(){
  332. var elements = document.getElementsByTagName("select");
  333. for (i=0;i< elements.length;i++){
  334. elements[i].style.visibility='hidden';
  335. }
  336. }