//-- Bartomedia AJAX Advanced Tracking Module Version: 1.00, //-- Copyright 2007 Bartomedia Software Corporation, All Rights Reserved. // JavaScript Document // AJAX REQUEST OBJECT ////////////////////// function createRequestObject() { var req; if( window.XMLHttpRequest ) {req = new XMLHttpRequest();}// Firefox, Safari, Opera... else if( window.ActiveXObject ) {req = new ActiveXObject("Microsoft.XMLHTTP");}// Internet Explorer 5+ else { //alert('There was a problem creating the XMLHttpRequest object'); } return req; } http = createRequestObject(); // Make the XMLHttpRequest object // JAVASCRIPT VISITOR DATA /////////////////////////////////////////////// function sendJavaScript() { // GET THE SCREEN PIXEL WIDTH AND HEIGHT var ss = screen.width + "x" + screen.height; // GET THE BROWSERS VIEWPORT PIXEL WIDTH AND HEIGHT var sv = getviewport(); // GET THE SCREEN COLOR DEPTH var sc = screen.colorDepth; // GET THE BROWSER USER AGENT var ua = navigator.userAgent; // GET PAGE REFERER var re = window.document.referrer; // GET JAVA ENABLED var ja = navigator.javaEnabled()?1:0; // PDF INSTALLED var pd = pdfTest(); // GET COOKIE ENABLED var co = cookieTest(); // GET FLASH IF ENABLED VERSION var fl = flashTest(); // GET THE BROWSERS DEFAULT LANGUAGE if (navigator.appName == 'Netscape') { var la = navigator.language; } else { var la = navigator.browserLanguage; } // BUILD VISITOR DATA STRING var javascriptString = 'ss=' + ss + '&sv=' + sv + '&sc=' + sc + '&ua=' + ua + '&re=' + re + '&ja=' + ja + '&pd=' + pd + '&co=' + co + '&fl=' + fl + '&la=' + la; //alert( javascriptString ); // SEND VISITOR DATA TO DATABASE try { if ( http != "undefined" ) { http.open('GET', 'javascript-update.php?' + javascriptString); http.onreadystatechange = javascriptResponse; http.send(null); } }catch(e) {} } // AJAX HANDLE RESPONSE ////////////////////////////////////// function javascriptResponse() { try { if((http.readyState != 4) || (http.status == 200)) { setTimeout('sendVisitDuration()', 1000); // EXECUTE AFTER 1 SEC TO TEST REAL VISITOR var response = http.responseText; //alert( " AJAX Success Status code : " + http.status ); if( response ) { // UPDATE ajaxTest content //alert( "javascript = " + response ); } return; } }catch(e) {} } // JAVASCRIPT VISITOR DATA //////////////////// function sendVisitDuration() { // UPDATE TIME EVERY SECOND var visitDurationTimer; visitDurationTimer = setTimeout('sendVisitDuration()', 10000); // EXECUTE AFTER 10 SEC TO TEST REAL VISITOR // SEND VISITOR DATA TO DATABASE try { if ( http != "undefined" ) { if ( clickedTarget ) { http.open('GET', 'visitduration.php?clickedTarget=' + clickedTarget); } else { http.open('GET', 'visitduration.php'); } //http.onreadystatechange = visitDurationResponse; http.send(null);// fails here } }catch(e) { /* http.abort(); // errors ie6 http = createRequestObject(); clearTimeout(visitDurationTimer); sendVisitDuration();*/ //alert(e); } } /* try {http.send(true);} catch (e) { //document.getElementById(”mydiv”).innerHTML = “danger, busy.. ” e; } */ // JAVASCRIPT VISITOR DATA RESPONSE /////////// function visitDurationResponse() { try { if((http.readyState != 4) || (http.status == 200)) { // Text returned FROM PHP script var response = http.responseText; //alert( " AJAX Success Status code : " + http.status ); if( response ) { // UPDATE ajaxTest content //alert( "VisitDuration = " + response ); } } }catch(e) {} } // JAVASCRIPT PDF TEST ///////////////////////// function pdfTest() { var pdf=0; if (window.ActiveXObject) { var control = null; // AcroPDF.PDF is used by version 7 and later try {control = new ActiveXObject('AcroPDF.PDF');} catch (e){}// Do nothing if (!control) {// PDF.PdfCtrl is used by version 6 and earlier try {control = new ActiveXObject('PDF.PdfCtrl');} catch (e){return;} } if (control) {pdf=1;} } else { var n = navigator.plugins; // Check navigator.plugins for "Adobe Acrobat" or "Adobe PDF Plug-in"* for (var i=0; i<=n.length; i++) { if (n[i].name == "Adobe Acrobat" || n[i].name == "Adobe PDF Plug-in") { var pdf=1; break; } } } return pdf; } // JAVASCRIPT COOKIE TEST ///////////////////// function cookieTest() { var c=0,d=document; d.cookie = "tc=1;expires=1000000"; if(d.cookie.indexOf('tc=1') == -1) {c=0;} else { c=1; var cookie_date=new Date(); cookie_date.setTime (cookie_date.getTime()-1); d.cookie="tc=1;expires="+cookie_date.toGMTString(); } return c; } // JAVASCRIPT FLASH TEST ////////////////////// function flashTest() { var f=0,n=navigator; if (n.plugins && n.plugins.length) { for (var ii=0;ii < n.plugins.length;ii++) { if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) { f=n.plugins[ii].description.split('Shockwave Flash ')[1]; break; } } } else if (window.ActiveXObject) { for (var ii=10;ii>=2;ii--) { try { var fl=eval("new ActiveXObject('ShockwaveFlash.ShockwaveFlash."+ii+"');"); if (fl) { f=ii + '.0'; break; } } catch(e) {} } } return f; } // JAVASCRIPT BROWSER WINDOW AND SCREEN SIZE // function getviewport(direction) { if (window.innerWidth) // FIREFOX { screenWidth = window.innerWidth; screenHeight = window.innerHeight; } else if (document.documentElement && document.documentElement.clientWidth) // SAFARI { screenWidth = document.documentElement.clientWidth; screenHeight = document.documentElement.clientHeight; } else if (document.body) // IE { screenWidth = document.body.clientWidth; screenHeight = document.body.clientHeight; } if ( direction == "width" ) {return screenWidth;} if ( direction == "height" ) {return screenHeight;} return screenWidth + "x" + screenHeight; //alert( "Viewport width=" +screenWidth + "px x height=" + screenHeight + "px"); } // JAVASCRIPT PRELOAD IMAGES ///////////////// function preload() { var args = preload.arguments; document.imgArray = new Array(args.length); for(var i=0; i < args.length; i++) { document.imgArray[i] = new Image; document.imgArray[i].src = args[i]; } } function preloadmouseoverimages() { preload('images/navbuttonleftover.jpg','images/navbuttonrightover.jpg','images/navbuttonbgover.jpg'); } // JAVASCRIPT ONLOAD EVENT ////////////////// function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { if (oldonload) { oldonload(); } func(); } } } // use add loadEvent like below //addLoadEvent(nameOfSomeFunctionToRunOnPageLoad); addLoadEvent(function() { // more code to run on page load //sendVisitDuration(userid); //preloadmouseoverimages(); if ( window.document.referrer ) { } sendJavaScript(); // Problem with this DoControlSetup(); }) // JAVASCRIPT UNLOAD EVENT ////////////////// function addUnloadEvent(func) { var oldOnunload = window.onunload; if (typeof window.onunload != 'function') { window.onunload = func; } else { window.onunload = function() { if (oldOnunload) { oldOnunload(); } func(); } } } // use add loadEvent like below //addLoadEvent(nameOfSomeFunctionToRunOnPageLoad); addUnloadEvent(function() { // more code to run on page unload //open_on_departure(); sendVisitDuration(clickedTarget); }) // POPUP ON UNLOAD EVENT ////////////////// /* window.onresize= reloadpage; function reloadpage(){ //or whatver else you have setTimeout("window.location.reload()",1); } */ function open_on_departure(url,name) { popupWin = window.open('http://mustard-graphics.co.uk','mustard', ' width=500,height=300,left=150,top=200'); } // EVENT FUNCTIONS ///////////////////////// function GetElementPosition(element) { var result = new Object(); result.x = 0; result.y = 0; result.width = 0; result.height = 0; // Firefox Netscape use offset if (element.offsetParent) { // offsetLeft offsetTop // distance of element from the left, in pixels result.x = element.offsetLeft; result.y = element.offsetTop; var parent = element.offsetParent; while (parent) { result.x += parent.offsetLeft; result.y += parent.offsetTop; var parentTagName = parent.tagName.toLowerCase(); if (parentTagName != "table" && parentTagName != "body" && parentTagName != "html" && parentTagName != "div" && parent.clientTop && parent.clientLeft) { // clientLeft clientTop // Read-only properties. Get the left and top side of a positioned element result.x += parent.clientLeft; result.y += parent.clientTop; } parent = parent.offsetParent; } } else if (element.left && element.top) { result.x = element.left; result.y = element.top; } else { if (element.x) { result.x = element.x; } if (element.y) { result.y = element.y; } } if (element.offsetWidth && element.offsetHeight) { result.width = element.offsetWidth; result.height = element.offsetHeight; } else if (element.style && element.style.pixelWidth && element.style.pixelHeight) { result.width = element.style.pixelWidth; result.height = element.style.pixelHeight; } return result; } // EVENT VARIABLES ///////////////////////////////////// var lastTarget = null; var curTarget = null; var clickedTarget = null; Number.prototype.NaN0=function(){return isNaN(this)?0:this;} function DoControlSetup() { //http://webfx.eae.net/dhtml/ieemu/eventlisteners.html // DEFINE PERMANENT STANDARD EVENTS HERE addEvent(document,"mousemove",mouseMove,false); addEvent(document,"click",mouseClick,false); addEvent(document,"dblclick",mouseDblClick,false); addEvent(document,"mousedown",mouseDown,false); addEvent(document,"mouseup",mouseUp,false); return; } function writeHistory(object, message) { var curObject; if(!object || !object.parentNode || !object.parentNode.getAttribute) return; if ( document.getElementById("History") ) { historyDiv = document.getElementById("History"); if ( ! object.id ) { curObject = object.nodeName; } else { curObject = object.nodeName + " " + object.id; } historyDiv.appendChild(document.createTextNode(curObject+': '+message)); historyDiv.appendChild(document.createElement('BR')); historyDiv.scrollTop += 50; } } function writeMouseCoordinates(x,y) { if(document.getElementById('MouseCoordinates')) { document.getElementById('MouseXPosition').value = x; document.getElementById('MouseYPosition').value = y; } } // EVENT FUNCTIONS ///////////////////////////////////////////////// function getPosition(e) { var left = 0; var top = 0; while (e.offsetParent) { left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0); top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0); e = e.offsetParent; } left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0); top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0); return {x:left, y:top}; } function mouseCoords(e) { if(e.pageX || e.pageY) { return { x:e.pageX,y:e.pageY }; } return { x:e.clientX + document.body.scrollLeft - document.body.clientLeft, y:e.clientY + document.body.scrollTop - document.body.clientTop }; } function getMouseOffset(target, e) { var docPos = getPosition(target); var mousePos = mouseCoords(e); return { x:mousePos.x - docPos.x, y:mousePos.y - docPos.y }; } // mouseMove IS INITIALISED ON LOAD, FIRES EVERY TIME THE MOUSE MOVES A PIXEL function mouseMove(e) { // DEFINE EVENT FOR ALL BROWSERS if (!e) var e = window.event; // DEFINE THE TARGET FOR ALL BROWSERS var targ; if (e.target) targ = e.target; // FireFox Netscape and Safari else if (e.srcElement) targ = e.srcElement; // IE Only if (targ.nodeType == 3)targ = targ.parentNode; // defeat Safari bug var target = targ; // GET THE MOUSE COORDINATES var mousePos = mouseCoords(e); // THE MOUSE HAS LEFT A TARGET if(lastTarget && (target!==lastTarget)) { mouseOut(lastTarget); } // THE MOUSE IS OVER A NEW TARGET if(target!=lastTarget) { mouseOver(target); } // WRITE THE MOUSE COORDINATES TO FIELDS writeMouseCoordinates(mousePos.x,mousePos.y); // END LOOP NEXT LOOP NOW TARGET IS THE LAST TARGET lastTarget = target; } // MOUSE EVENTS function mouseClick(e) { clickedTarget = lastTarget; var clickedTargetTagName = clickedTarget.tagName.toLowerCase(); var text; var title; var url; var result = GetElementPosition(clickedTarget); var x = result.x; var y = result.y; var w = result.width; var h = result.height; if (clickedTargetTagName != 'a' && clickedTarget.offsetParent) { if ( clickedTarget.alt ){ text = clickedTarget.alt; } //if ( clickedTarget.title ){ title = clickedTarget.title; } else { if ( clickedTarget.alt ){ title = clickedTarget.alt; } } // HUNT FOR DESTINATION URL var parent = clickedTarget.parentNode; while (parent) { var parentTagName = parent.tagName.toLowerCase(); if (parentTagName == 'form' || parentTagName == 'a') { if ( parentTagName == 'form' ) { url = parent.action; break; } if ( parentTagName == 'a' ) { url = parent.href; //title = parent.title; break; } } parent = parent.parentNode; } } else { if ( clickedTarget.innerHTML ){ text = clickedTarget.innerHTML; } //if ( clickedTarget.title ){ title = clickedTarget.title; } if ( clickedTarget.href ){ url = clickedTarget.href; } } clickedTarget = escape(text+"|"+url+"|"+x+"|"+y+"|"+w+"|"+h); if ( lastTarget ) { writeHistory(lastTarget, 'Mouse Click'); } } function mouseDblClick(e) { if ( lastTarget ) { writeHistory(lastTarget, 'Mouse Double Click'); } } function mouseDown(e) { if ( lastTarget ) { writeHistory(lastTarget, 'Mouse Down'); curTarget = lastTarget; writeHistory(curTarget, 'Current Target'); } } function mouseUp(e) { if ( lastTarget ) { writeHistory(lastTarget, 'Mouse Up'); } } // PRINCIPLE IS TO ATTACH AND DETACH EVENTS AS U MOUSEOVER AND MOUSEOUT THEN THERE IS NO CONFUSION WITH UNDERLYING EVENTS function mouseOver(object) { writeHistory(object, 'Mouse Over'); /* if ( object.id == oSplitterCell_X.id ) { writeHistory(object, 'Attach Event SelectSplitter'); addEvent(oSplitterCell_X,"mousedown",SelectSplitter,false); writeHistory(object, 'Attach Event ReleaseSplitter'); addEvent(oSplitterCell_X,"mouseup",ReleaseSplitter,false); } if ( object.id == "ResizeSplitterToggle_X" ) { writeHistory(object, 'Attach Event OpenClosePanel'); addEvent("ResizeSplitterToggle_X","click",OpenClosePanel,false); } if ( object.id == oSplitterCell_Y.id ) { writeHistory(object, 'Attach Event SelectSplitter'); addEvent(oSplitterCell_Y,"mousedown",SelectSplitter,false); writeHistory(object, 'Attach Event ReleaseSplitter'); addEvent(oSplitterCell_Y,"mouseup",ReleaseSplitter,false); } if ( object.id == "ResizeSplitterToggle_Y" ) { writeHistory(object, 'Attach Event OpenClosePanel'); addEvent("ResizeSplitterToggle_Y","click",OpenClosePanel,false); } */ } function mouseOut(object) { writeHistory(object, 'Mouse Out'); /* if ( object.id == oSplitterCell_X.id ) { writeHistory(object, 'Remove Event SelectSplitter'); removeEvent(oSplitterCell_X,"mousedown",SelectSplitter,false); writeHistory(object, 'Remove Event ReleaseSplitter'); removeEvent(oSplitterCell_X,"mouseup",ReleaseSplitter,false); } if ( object.id == "ResizeSplitterToggle_X" ) { writeHistory(object, 'Remove Event OpenClosePanel'); removeEvent("ResizeSplitterToggle_X","click",OpenClosePanel,false); } if ( object.id == oSplitterCell_Y.id ) { writeHistory(object, 'Remove Event SelectSplitter'); removeEvent(oSplitterCell_Y,"mousedown",SelectSplitter,false); writeHistory(object, 'Remove Event ReleaseSplitter'); removeEvent(oSplitterCell_Y,"mouseup",ReleaseSplitter,false); } if ( object.id == "ResizeSplitterToggle_Y" ) { writeHistory(object, 'Remove Event OpenClosePanel'); removeEvent("ResizeSplitterToggle_Y","click",OpenClosePanel,false); } */ } ////////////////////////////////////////////////////////////// // EVENT REGISTRATION //////////////////////////////////////// function addEvent(el,type,listener,useCapture) { if(typeof el == 'string') { el = document.getElementById(el); } if(!el) { return false; } if(document.addEventListener) { // W3C DOM Level 2 Events - used by Mozilla, Opera and Safari if(!useCapture) { // False is bubbling in all browsers no capture in IE useCapture = false; } else { useCapture = true; } el.addEventListener(type,listener,useCapture); } else { // MS implementation - used by Internet Explorer el.attachEvent('on'+type, listener); } } function removeEvent(el,type,listener,useCapture) { if(typeof el == 'string') { el = document.getElementById(el); } if(!el) { return false; } if(document.removeEventListener) { // W3C DOM Level 2 Events - used by Mozilla, Opera and Safari if(!useCapture) { // False is bubbling in all browsers no capture in IE useCapture = false; } else { useCapture = true; } el.removeEventListener(type,listener,useCapture); } else { // MS implementation - used by Internet Explorer el.detachEvent('on'+type, listener); } } function stopPropogation(e) { if (e && e.stopPropogation) e.stopPropogation(); else if (window.event && window.event.cancelBubble) window.event.cancelBubble = true; } function stopDefault(e) { if (e && e.preventDefault) e.preventDefault(); else if (window.event && window.event.returnValue) window.eventReturnValue = false; } ///////////////////////////////////////////////////////// /* function id_all_a_tags() { var body = document.getElementsByTagName('BODY')[0]; var elementsA = body.getElementsByTagName('A'); for(var i=0;i