<title>JavaScript/Ajax Shared Whiteboard</title>

body {
text-align: center
.stdbtn { width:280px; }
<!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->

<link rel="stylesheet" type="text/css" href="jqpopup.css"/>
<link rel="stylesheet" type="text/css" href="jqcp.css"/>
<link rel="stylesheet" type="text/css" href="paint2.css"/>
<script type="text/javascript" src="paint2.js"></script>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.bgiframe.min.js"></script>
<script type="text/javascript" src="jqDnR.min.js"></script>
<script type="text/javascript" src="jquery.jqpopup.min.js"></script>
<script type="text/javascript" src="jquery.jqcp.min.js"></script>

<script type="text/javascript" src="canvastext.js"></script>
<script type="text/javascript">
var newWind7 = null;

function openIt7() {

if(newWind7) {


else {
newWind7 = window.open("tryit.html","joe7","height=475,width=250");
return false;


function doIt2(event) {
if(newWind7) {
if(!event) event=window.event;
var canvas2, bb, x, y;
// Get <canvas> element from the context object
canvas2 = document.getElementById("mycanvas");
c2 = canvas2.getContext('2d');
// Get canvas size and position
bb = canvas2.getBoundingClientRect();
// Convert mouse event coordinates to canvas coordinates
x = (event.clientX-bb.left) * (canvas2.width/bb.width) - 100;
y = (event.clientY-bb.top) * (canvas2.height/bb.height) - 100;
// Call isPointInPath with these transformed coordinates
// change to copying one canvas and putting it in another ->return context.isPointInPath(x,y);
var canvas = newWind7.document.getElementById("my_canvas_id");
c2.drawImage(canvas, x, y)

// alert(x + " " + y);


// end new

var pmousex = 0;
var pmousey = 0;
var nmousex = 0;
var nmousey = 0;
var ctx;
var c;

var mycanvas;
var isAvail;

var yourname;
var othername;
var thetimer = null;

var drawColor = 'black';
var drawWidth = 1;
var lastdrawColor;
var lastdrawWidth;

var isTextT = false;
var tfont = 'sans';
var tfontsize = 10;
var mouseIsdown = false;

function drawtheImage(reg) {

var imageName;

if(reg == "A") {
imageName = document.getElementById("imageName").value;
} else if(reg == "B"){
imageName = "theimage3.png";
} else {

imageName = "white.png";
var thebogus = (Math.floor(Math.random() * 10000000000)).toString();
// alert(thebogus);
var img = null;
img = new Image();
img.src = "thisuploads/" + imageName + "?" + thebogus;
img.onload = function(){

if(reg == "C") sendContent();



// need textbox for your name and other's name
// isAvail is textbox that reads who is the user from the server (starts with 'available')

function doBinds() {

if($("available").text().indexOf(othername) < 0) {

$("#mycanvas").bind("mousedown", function(e) {
ctx.strokeStyle = drawColor;
ctx.fillStyle = drawColor;
ctx.lineWidth = drawWidth;
pmousex = e.pageX - 62; // adjust for position of canvas
pmousey = e.pageY - 163; // adjust for position of canvas

ctx.moveTo(pmousex, pmousey);
var curtext = document.getElementById("insertText").value;

mouseIsdown = true;

if(e.shiftKey) {
isTextT = true;


isTextT = false;


if(!isTextT) {

$("#mycanvas").bind("mousemove", function(e) {
nmousex = e.pageX - 62; // adjust for position of canvas
nmousey = e.pageY - 163; // adjust for position of canvas

ctx.lineTo(nmousex, nmousey);







$("#mycanvas").bind("mouseup", function(){

mouseIsdown = false;


} else {

isTextT = false;
mouseIsdown = false;

$("#mycanvas").bind("mouseout", function(e) {

mouseIsdown = false;

function returnStatus2(){

thetimer = setInterval(function() {

$.post("readAvail3.php",{'mydata': ""},function(d) {


function getXMLHttp() {

var XMLHttp = null;
if (window.XMLHttpRequest)
try {
XMLHttp = new XMLHttpRequest();
} catch (e) { }
} else if(window.ActiveXObject) {
try {
XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) { }
return XMLHttp;

function sendContent() {

asyncRequest = getXMLHttp(); // create request object

// register event handler
asyncRequest.onreadystatechange = processResponse;
asyncRequest.open("POST", "save3.php", true); // prepare the request
asyncRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
asyncRequest.send("u="+mycanvas.toDataURL()); // send the request

function startNew(){

$.post("usertxt3.php",{'mydata': yourname + " is drawing now"}, function() {ctx.moveTo(pmousex,pmousey);



function processResponse() {
if ( asyncRequest.readyState == 4 && asyncRequest.status == 200)
asyncRequest = null;


function returnStatus(){



window.onunload = function(){

if(newWind7) newWind7.close();

window.onload = function(){

wsp = document.getElementById('workspace');

//set up canvas
canvas = document.getElementById('mycanvas');
ctx = document.getElementById('mycanvas').getContext('2d');

mycanvas = document.getElementById('mycanvas');
isAvail = document.getElementById('available');


c = ctx;

font = "sans";
fontsize = 10;
// iface.status = document.getElementById('status').firstChild;
// iface.xy = document.getElementById('xy').firstChild;
// iface.txy = document.getElementById('txy').firstChild;

//set up defaults
c.tool = new tool.line();
c.lineWidth = 1;
c.strokeStyle = '#000';
c.fillStyle = '#FFF';
c.tertStyle = '#DDD';
c.strokeFill = 1; //outline shapes
// prefs.pretty = document.getElementById('pretty').checked;
// prefs.controlpoints = document.getElementById('controlpoints').checked;

ctx.strokeStyle = 'black';
ctx.lineWidth = 1;

//set up overlay canvas (for preview when drawing lines, rects etc)
canvastemp = document.getElementById("canvastemp");
ctemp = canvastemp.getContext("2d");

//set up selection canvas (invisible, used for selections)
canvassel = document.getElementById("canvassel");
csel = canvassel.getContext("2d");

//set up undo canvas (invisible)
canvasundo = document.getElementById("canvasundo");
cundo = canvasundo.getContext("2d");

window.onmouseup = bodyUp;
window.onmousemove = bodyMove;
// window.onkeydown = shortcuts;

if(document.location.search) {


// timer runs for both at first, then only for non-active person
// timer reads shWBavail.txt and loads that value into textbox id=isAvail via checkAvail.php

thetimer = setInterval(function() {

$.post("readAvail3.php",{'mydata': ""},function(d) {


$("#lastuser").bind("click",function(e) {

$("#buttonDONE").bind("click",function(e) {



themessage = "available for " + othername + " of ACTIVE PAIR";

// usertxt.php sets the username of the person using OR sets that textbox to available
$.post("usertxt3.php",{'mydata': themessage},function() {returnStatus();});


$("#buttonMYTURN").bind("click",function(e) {

thetimer = null;
drawColor = 'black';
drawWidth = 1;
tfontsize = 10;
document.getElementById("mycb").checked = false;

othername = $("#otherusername").val();
yourname = $("#yourusername").val();

if($("available").text().indexOf(othername) < 0){

alert("After closing this alert box ***WAIT*** and ** let OTHER'S drawing happen before beginning ** -- top of page will read YOU are drawing, when canvas is ready");

isAvail.innerHTML = yourname + " is now drawing";



alert('TO USE THIS APPLICATION, you simply religiously take turns. This is simple, since it is indicated within 5 sec when each person takes a turn & then also within 5 sec when the canvas becomes available to the other for drawing again. (Also know that a person taking a turn can just collect the OTHER\'S updated drawing and then click DONE, if desired) The FIRST TURN TAKER should wait 5 sec after clicking "My Turn" before beginnig to drawing.');


function setEraser()

lastdrawColor = drawColor;
lastdrawWidth = drawWidth;
drawColor = 'white';
drawWidth = 10;
alert("This actually erases by drawing with a 10px-wide white brush. You will have to click the 'Draw Again' button to return to drawing after erasing.");


function setBack()
drawColor = lastdrawColor;
drawWidth = lastdrawWidth;


function setTheColor(thecolor)
drawColor = thecolor;


function setT()
if(document.getElementById("mycb").checked) {

tfontsize = 12;

if(!(document.getElementById("mycb").checked)) {

tfontsize = 10;

<body id="body">

<div id="toolbar">
<ul id="buttons">

<li id="line" onmousedown="buttonDown(event, this)" onclick="selTool(this)" onmouseout="buttonReset(this)" title="Line"> <img src="buttons/line.gif" /> </li>
<li id="rectangle" onmousedown="buttonDown(event, this)" onclick="selTool(this)" onmouseout="buttonReset(this)" title="Rectangle"> <img src="buttons/rectangle.gif" /> </li>

<li id="ellipse" onmousedown="buttonDown(event, this)" onclick="selTool(this)" onmouseout="buttonReset(this)" title="Ellipse"> <img src="buttons/ellipse.gif" /> </li>
<li id="rounded" onmousedown="buttonDown(event, this)" onclick="selTool(this)" onmouseout="buttonReset(this)" title="Rounded Rectangle"> <img src="buttons/rounded.gif" /> </li>


<div class="preload" style="background-image:url(icons/dashed2.gif)"></div>
<div class="preload" style="background-image:url(icons/dotted.gif)"></div>
<div id="menubar"></div>
<div id="settings"></div>

<div id="workspace" style="position: absolute; width: 710px; height: 610px; z-index: 1; left: 56px; top: 156px;border: 3px double #FF0000" width="710">
<canvas id="mycanvas" width=700 height=600 ondblclick="doIt2(event);"></canvas>
<div id="canvasresize" style="display:none;"></div>

<div><canvas id="canvastemp" style="position: absolute; width: 700px; height: 600px;"oncontextmenu="return false"></canvas>


<div id="statusbar"><div id="statusbar2">
<div id="status"><div>&nbsp;</div></div>
<div id="xy"><div>&nbsp;</div></div>
<div id="txy"><div>&nbsp;</div></div>
<div id="titlebar" onmousedown="windowDrag(event)"><canvas id="gradient" height="20" width="200"></canvas><h1 onmousedown="event.preventDefault()">untitled - CanvasPaint</h1></div>

<canvas id="canvassel" width="700" height="600" style="display:none;margin-top:470px;border:1px solid green"></canvas>
<canvas id="canvasundo" width="700" height="600" style="display:none;border:1px solid red"></canvas>

<div style="position: absolute; width: 900px; z-index: 1; left: 0px; top: 0px" id="layer1">
Fill in both textboxes before clicking on the canvas: <input type="text" size="15" id="yourusername" value="YOUR username" />
<input type="text" size="15" id="otherusername" value="OTHER'S username" />
<a href="drawDir2.htm" target="_blank">LINK TO SOME DIRECTIONS & INFO</a><br />
(Main user (<b>one of the users</b>) must be "user1" (no quotes).).

<br />
<input type="button" id="lastuser" value="1st & Last Drawer CLICK HERE" /> (<- at very start & end of session, respectively)

<br />
<center><div id="available">Check HERE (in 5 sec) to see if this application is in use by another pair of users</div></center>
<input type="button" value="My Turn" id="buttonMYTURN" /><input type="button" value="DONE w/ my turn" id="buttonDONE" />

<br />
<hr color="#008000" size="6"><br /><br />

<div id="controls" style="position: absolute; width: 900px; height: 156px; z-index: 1; left: 0px; top: 780px; border-style: solod; border-color: #000000">
<center><span>Make selections before mousedown (to draw with new color/thickness); INITIAL default is Black, Thin: </span>
<input type="button" value="Erase" onclick="setEraser(); return false;" />
<input type="button" value="Draw Again" onclick="setBack(); return false;" />
<br />
Thick?:<input type="checkbox" id="mycb" onchange="setT(); return false;" /> (FUN HACK: For REALLY THICK line, click Erase & then Pick a Color; Draw Again returns to prevous color/thickness.)

<div id="colorbox" style="display:none" title="Color Picker">
<td colspan="3">
H:<input type="text" id="jqcp_h" size="3" value="0"/>
S:<input type="text" id="jqcp_s" size="3" value="0"/>
L:<input type="text" id="jqcp_l" size="3" value="0"/><br/>
R:<input type="text" id="jqcp_r" size="3" value="255"/>
G:<input type="text" id="jqcp_g" size="3" value="255"/>
B:<input type="text" id="jqcp_b" size="3" value="255"/><br/>
<input type="text" id="color_value" class="jqcp_value" size="8"/>
<input type="button" id="pick_color" value="Pick"/>
<td align="left"><div id="color_picker"></div></td>

Color: <input type="text" id="product_color" name="product_color" size="6" style="font-size: 80%; height:20px;width:60px"/>
<img id="jqcp_box" src="images/jqcp_box.gif" alt="pick color" border="0"/>
<img id="jqcp_popup" src="images/jqcp.gif" style="cursor:pointer" alt="pick color" border="0"/>
<br />
Fill Next Closed Shape?:<input type="checkbox" id="mycb2" /> IF SO: USING ALPHA (0.0 - 1.0): <input type="text" size="3" id="tbalpha" value="1.0" /> &nbsp;

<script type="text/javascript">
$(document).ready(function() {

$("#jqcp_popup").click(function () {
return false;

$("#pick_color").click(function () {
<br />
<input type="button" value="Click this button to Open a window to make your own shape THEN double-click on main canvas to copy that image AT THAT SPOT" onclick="openIt7();">
<input type="button" value="OPTIONAL: Load your uploaded theImage.png AT begin of SESSION" onclick="drawtheImage('A');" return false;" />

<br /> Image name (fill in BEFORE clicking optional button (above)): <input type="text" id="imageName" value="Your saved png name" />

<br /><br />Text to insert (via Shift Key AND Keydown at location desired (immediately followed by keyup))(<b>FireFox ONLY</b>): <input type="text" id="insertText" value="" />
<br />(<b>NOTES: When using shapes: Click a Button before the drawing of EACH SHAPE -- even when 2 of the same shapes are drawn in a row. Colors/Thickness is applied ONLY after it has been applied to a freestyle line or dot (1 click w/ no mousemove suffices). <br />
There is about 5px padding between the 700X600px canvas and the div (with a red border) -- do not try to draw within 5 px of the red border.</b>)
<div id="formDiv" style="position: absolute; width: 900px; height: 200px; z-index: 1; left: 0px; top: 1100px; border-style: solod; border-color: #000000">
<h2>UPLOAD FACILITY (uploads to the thisuploads folder w/i this subdomain): This facility should be used
ONLY at the end of a session, to save a canvas image you want to draw on some more IN ANOTHER SHARED DRAWING SESSION.</h2>
<form name="form2" enctype="multipart/form-data" action="ntemptrans.php" method="post">
Browse to [theNameYOUgaveIT].png image which you saved to your desktop by right-clicking the canvas and saving
its image THEN UPLOAD.<br>
<b>(Keep things to 560kb or less.)</b><br /><br />
<input type="file" size="30" name="myUpload"><br>

<input type="hidden" name="MAX_FILE_SIZE" value="560000" />
<input type="submit" value="CLICK here to UPLOAD FILE">