// (c) 2008 HMD Change Technology LLC


//----------------------------------------//
var notesAll = new Array( 'A','A#/Bb','B','C','C#/Db',
	'D','D#/Eb','E','F','F#/Gb','G','G#/Ab' );
var lastKey = 'C';
function setKey( key ) {
	var ni = -1;
	for( var i = 0; i < notesAll.length; i++ ) {
		if( notesAll[ i ] == key ) {ni = i;}
	}
	if( ni == -1 ) {alert( "Key not found, no change made." );}
	else {
		var n = new Array( );
		for( var i = ni; i < notesAll.length; i++ ) {
			n.push( notesAll[ i ] );
		}
		for( var i = 0; i < ni; i++ ) {
			n.push( notesAll[ i ] );
		}
		notesAll = n;
	}
	lastKey = key;
}
function getLastKey( ) {return lastKey;}


//----------------------------------------//
// add new modes here, use chromatic half steps and use number, 0 being tonic, as definition
// add to select control for the mode selection
var selectedMode;
var modes = new Array( );
modes[ 'Ionian' ] = new Array( 0,2,4,5,7,9,11,12 );//W - W - H - W - W - W - H
modes[ 'Dorian' ] = new Array( 0,2,3,5,7,9,10,12 );//W - H - W - W - W - H - W
modes[ 'Phrygian' ] = new Array( 0,1,3,5,7,8,10,12 );//H - W - W - W - H - W - W
modes[ 'Lydian' ] = new Array( 0,2,4,6,7,9,11,12 );//W - W - W - H - W - W - H
modes[ 'Mixolydian' ] = new Array( 0,2,4,5,7,9,10,12 );//W - W - H - W - W - H - W
modes[ 'Aeolian' ] = new Array( 0,2,3,5,7,8,10,12 );//W - H - W - W - H - W - W
modes[ 'Locrian' ] = new Array( 0,1,3,5,6,8,10,12 );//H - W - W - H - W - W - W
modes[ 'Harmonic Major' ] = new Array( 0,2,4,5,7,8,11,12 );
modes[ 'Harmonic Minor' ] = new Array( 0,2,3,5,7,8,11,12 );
modes[ 'Melodic Major' ] = new Array( 0,2,4,5,7,8,10,12 );
modes[ 'Melodic Minor' ] = new Array( 0,2,3,5,7,9,11,12 );
modes[ 'Double Harmonic Major' ] = new Array( 0,1,4,5,7,8,11,12 );
modes[ 'Double Harmonic Minor' ] = new Array( 0,2,3,6,7,8,11,12 );
modes[ 'Spanish Gypsy' ] = new Array( 0,1,4,5,7,8,10,12 );
modes[ 'Blues' ] = new Array( 0,3,5,6,7,10,12 );
modes[ 'Major Pentatonic' ] = new Array( 0,2,4,7,9,12 );
modes[ 'Minor Pentatonic' ] = new Array( 0,3,5,7,10,12 );

function getNotes( mode ) {
	selectedMode = mode;
	return getNoteList( modes[ mode ] );
}

function getNoteList( mode ) {
	var r = "";
	for( var i = 0; i < mode.length; i++ ) {
		if( mode[ i ] == notesAll.length ) {
			r += notesAll[ 0 ];
		} else {
			r += notesAll[ mode[ i ] ] + ", ";
		}
	}
	return r;
}

function getNoteImageHTML( notes ) {
	var n = notes.split( ', ' );
	var p = 1, arp = "";
	var r = '<div id="noteimages"><img src="./images/staff_44_g.png" />';
	for( var i = 0; i < n.length; i++ ) {
		n[ i ] = getSharpAdjustment( n[ i ] );
		if( i > 0 && i % 4 == 0 ) {
			r += '<img src="./images/measure_line.png" />';
		}
		r += '<img src="./images/note_quarter_' + n[ i ] + '_' + p + '.png" />';
		if( i == 0 || i == 2 || i == 4 || i == 7 ) {
			arp += '<img src="./images/note_quarter_' + n[ i ] + '_' + p + '.png" />';
		}
		if( n[ i + 1 ] && isNextLevel( n[ i ], getSharpAdjustment( n[ i + 1 ] ) ) ) {
			p++;
		}
	}
	r = r + '<img src="./images/measure_line.png" />' + arp;
	return r + '<img src="./images/measure_end.png" /></div>';
}

function getSharpAdjustment( n ) {
	if( n.indexOf( '#' ) > -1 ) {
		return n.substring( 0, n.indexOf( '#' ) ).toLowerCase( ) + "_sharp";
	} else {return n.toLowerCase( );}
}

function isNextLevel( n1, n2 ) {
	if( n1 == 'c_sharp' || n1 == 'd' || n1 == 'd_sharp' ) {
		if( n2 == 'd_sharp' || n2 == 'd' ) {
			return false;
		} else {return true;}
	}
	return false;
}

//----------------------------------------//
var maxFret = 14;
var offB = new Array( "B", "C", "C#/Db", "D", "D#/Eb", "E", "F", "F#/Gb", "G", "G#/Ab" );
var offG = new Array( "G", "G#/Ab" );
var offD = new Array( "D", "D#/Eb", "E", "F", "F#/Gb", "G", "G#/Ab" );
var offA = new Array( );//"A", "A#/Bb", "B", "C", "C#/Db" );
var offE = new Array( "E", "F", "F#/Gb", "G", "G#/Ab" );

// n is a list of notes separated by a comman and space, accidentals should be list as A#/Bb for example
function getTabTextNeck( n ) {
	n = n.split( ', ' );
	var last = 0, now = 0;
	var r = '<div>' + ( modes[ selectedMode ].length - 1 ) + ' Notes Per String</div>';
	r += '<div class="tab">';
	r += "<div>e |" + getStringTab( n, 5, getAdjust( n[ 0 ], offE ), maxFret, 1 ) + "|</div>";
	r += "<div>B |" + getStringTab( n, 10, getAdjust( n[ 0 ], offB ), maxFret, 1 ) + "|</div>";
	r += "<div>G |" + getStringTab( n, 2, getAdjust( n[ 0 ], offG ), maxFret, 1 ) + "|</div>";
	r += "<div>D |" + getStringTab( n, 7, getAdjust( n[ 0 ], offD ), maxFret, 1 ) + "|</div>";
	r += "<div>A |" + getStringTab( n, 0, getAdjust( n[ 0 ], offA ), maxFret, 1 ) + "|</div>";
	r += "<div>E |" + getStringTab( n, 5, getAdjust( n[ 0 ], offE ), maxFret, 1 ) + "|</div>";
	return r + "</div>";
}
// isNeck and nnMax from getTabTextNeck() this function reused by x notes per string section
function getStringTab( n, firstA, adj, max, isNeck, nnMax ) {
	var s = "", last = 0, now = 0, val = 0;
	var nn = new Array( );
	for( var i = 0; i < n.length; i++ ) {
		if( !isNeck ) {
			if( i % 4 == 0 ) {s += "|";}
		}
		now = getFretNumber( n[ i ], firstA, last );
		val = ( now + adj );
		if( val > max ) {
			val = val - 12;
		}
		if( val < 10 ) {
			if( !isRedundant( nn, '0' + val ) ) {
				nn.push( '0' + val );
			}
		} else {
			if( !isRedundant( nn, val ) ) {
				nn.push( val );
			}
		}
		if( !isNeck ) {
			s += getTabbedFret( val, i );
		}
		last = now;
	}
	if( isNeck ) {
		nn.sort( );
		for( var i = 0; i < modes[ selectedMode ].length - 1; i++ ) {
			nn[ i ] = nn[ i ].toString( ).replace( /^0/, '' );
			s += getTabbedFret( nn[ i ], i );
		}
	}
	return s;
}

function isRedundant( a, v ) {
	for( var i = 0; i < a.length; i++ ) {
		if( a[ i ] == v ) {return true;}
	}
	return false;
}

function getTabbedFret( f, o ) {//formats display spacing
	var r = f;
	if( f < 10 ) {r += " ";}
	return r + "- - ";
}

function getAdjust( n, list ) {
	var f = 0;
	for( var i = 0; i < list.length; i++ ) {
		if( n == list[ i ] ) {
			f = -12;i = list.length;
		}
	}
	return f;
}

// n is the note name, reference is the first fret for the A note, last is the last note given 
function getFretNumber( n, ref, last ) {
	var f = 0;
	if( n == "A" )     {f = 0 + ref;}
	if( n == "A#/Bb" ) {f = 1 + ref;}
	if( n == "B" )     {f = 2 + ref;}
	if( n == "C" )     {f = 3 + ref;}
	if( n == "C#/Db" ) {f = 4 + ref;}
	if( n == "D" )     {f = 5 + ref;}
	if( n == "D#/Eb" ) {f = 6 + ref;}
	if( n == "E" )     {f = 7 + ref;}
	if( n == "F" )     {f = 8 + ref;}
	if( n == "F#/Gb" ) {f = 9 + ref;}
	if( n == "G" )     {f = 10 + ref;}
	if( n == "G#/Ab" ) {f = 11 + ref;}
	if( f < last )     {f = f + 12;}
	else if( f < 0 )   {f = f + 12;}
	return f;
}

//----------------------------------------//
var skipped = false;
// n is a list of notes separated by a comman and space, accidentals should be list as A#/Bb for example
function getTabNotePerStringPattern( n, notesPerString ) {
	var maxF = 100;
	var nn = getConsecutiveNotes( n, notesPerString );
	var ff = getFretsArray( nn, 5, offE, maxF );
	var frets = getHTMLFromArray( ff, notesPerString );
	var r = '<div>Tonic Position ' + notesPerString + 
		' Notes / String</div>';
	r += '<div class="tab">' + frets + '</div>';
	if( skipped ) {
		r += '<div style="font-size:8px;">High frets were skipped or omitted.</div>';
	}
	skipped = false;
	return r + "</div>";
}

function getConsecutiveNotes( noteList, notesPerString ) {
	noteList = noteList.split( ', ' );
	var cf = new Array( );//makes one large array with all fret #'s 
	var ii = 0;
	for( var i = 0; i < ( notesPerString * 6 ); i++ ) {
		cf[ i ] = noteList[ ii++ ];
		if( ii == noteList.length - 1 ) {ii = 0;}
	}
	return cf;
}

function getFretsArray( noteArray, firstA, offset, maxFret ) {
	var f = getStringTab( 
		noteArray, firstA, 
		getAdjust( noteArray[ 0 ], offset ), maxFret 
	) ;
	f = f.replace( /[ \-]/g, ' ' );///[ ]*\- \- \- /g, ',' );
	f = f.replace( /[ ]+/g, ',' );///[ ]*\- \- \- /g, ',' );
	f = f.replace( /\||,$/g, '' );
	// fix errors in -12
	var ff = f.split( ',' )
	var old = 0;
	for( var i = 0; i < ff.length; i++ ) {
		while( parseInt( ff[ i ] ) < old ) {
			ff[ i ] = parseInt( ff[ i ] ) + 12;
		}
		old = parseInt( ff[ i ] );
	}
	return ff;
}

function getHTMLFromArray( a, notesPerString ) {
	var n = '';
	for( var i = 0; i < notesPerString; i++ ) {
		n += '[0-9]*,';
	}
	n = n.replace( /,$/, '' );
	n = new RegExp( '(' + n + '),', 'g' );///'(' + n + '),'/g;
	var f = a.toString( );
	f = f.replace( n, '$1;' );
	a = f.split( ';' );
	a = a.reverse( );
	f =  getAdjustedStringHTML( a[ 0 ], -24, 'e' );
	f += getAdjustedStringHTML( a[ 1 ], -19, 'B' );
	f += getAdjustedStringHTML( a[ 2 ], -15, 'G' );
	f += getAdjustedStringHTML( a[ 3 ], -10, 'D' );
	f += getAdjustedStringHTML( a[ 4 ], -5, 'A' );
	f += getAdjustedStringHTML( a[ 5 ], 0, 'E' );
	return f;
}

function getAdjustedStringHTML( s, offset, stringName ) {
	var ss = s.split( ',' );
	var n = 0;
	s = '';
	for( var i = 0; i < ss.length; i++ ) {
		n = parseInt( ss[ i ] ) + offset;
		if( n > -1 && n < 23) {
			s += n + ' - ';
		} else {
			s += '- - ';
			skipped = true;
		}
	}
	s = s.replace( /([0-9][0-9]) /g,  '$1' );
	return '<div>' + stringName + ' |' + s + '|</div>';
}


//----------------------------------------//
// put chords in chromatic context; add new chords here in a six value string separated by spaces, 
// use x for muted strings, have root on low e string
// reference: http://www.all-guitar-chords.com/chord_name.php
var chords = new Array( );
chords[ 'major triad' ] = '1 5 8 x x x';
chords[ 'minor triad' ] = '1 4 8 x x x';
chords[ 'major' ] = '1 8 13 17 20 25';
chords[ 'minor' ] = '1 8 13 16 20 25';
chords[ 'dim' ] = '1 7 13 16 x x';
chords[ 'aug' ] = '1 9 13 17 x x';
chords[ 'sus2(ver 1)' ] = '1 8 15 x x x';
chords[ 'sus2(ver 2)' ] = '1 x 8 15 20 x';
chords[ 'sus4' ] = '1 6 13 18 20 25';
chords[ 'sus2sus4' ] = '1 x 8 15 18 x';
chords[ 'Major b5' ] = '1 7 13 17 20 25';
chords[ 'minor b5' ] = '1 7 13 16 20 25';
chords[ '5(ver 1)' ] = '1 8 x x x x';
chords[ '5(ver 2)' ] = '1 8 13 x x x';
chords[ '-5' ] = '1 7 13 17 x x';
chords[ '6' ] = '1 10 13 17 x x';
chords[ '6(ver 2)' ] = '1 x 13 17 22 x';
chords[ 'm6' ] = '1 8 13 16 22 x';
chords[ '7' ] = '1 8 11 17 20 25';
chords[ 'm7' ] = '1 8 11 16 20 25';
chords[ 'Maj7' ] = '1 8 12 17 x x';
chords[ 'mMaj7' ] = '1 8 12 16 x x';
chords[ '7sus4' ] = '1 6 11 18 20 25';
chords[ '7#5(ver 1)' ] = '1 x 13 19 23 x';
chords[ '7#5(ver 2)' ] = '1 x 11 17 21 x';
chords[ '7#9(no 5)' ] = '1 5 11 16 x x';
chords[ '7/9' ] = '1 5 11 13 x x';
chords[ '9' ] = '1 8 11 17 23 27';
chords[ 'add9' ] = '1 8 13 17 20 27';
chords[ 'madd9' ] = '1 8 15 16 x x';
chords[ '9' ] = '1 5 11 15 20 x';
chords[ '9(no 3)' ] = '1 x 11 15 20 x';
chords[ '9(no 5)' ] = '1 5 11 15 x x';
chords[ '9b5' ] = '1 5 11 15 19 x';
chords[ '9#5' ] = '1 5 11 15 21 x';
chords[ '11' ] = '1 6 11 17 20 27';
chords[ '13' ] = '1 x 11 17 22 27';

function getChordMatches( n ) {
	var m = '';
	var mn = convertNotesToNumbers( n );
	for( var i in chords ) {
		if( hasMatchInBigString( mn, chords[ i ] ) ) {
			m += getChordLink( i, chords[ i ] );
		}
	}
	if( m.length == 0 ) {m = 'none';}
	m = m.replace( /, $/, '' );
	return '<div>Tonic Chords: ' + m + '</div>';
}

function getChordLink( chordName, varName ) {
	return '<a href="#" onclick="showChordFrame( \'' + 
		chordName + '\', \'' + varName + '\' );">' + 
		chordName + '</a>, ';
}

function convertNotesToNumbers( n ) {
	var nForMode = '';
	for( var i = 0; i < notesAll.length; i++ ) {
		if( n.indexOf( notesAll[ i ] + "," ) > -1 ) {
			nForMode = nForMode + ( i + 1 ) + ',';
		}
	}
	for( var i = 0; i < notesAll.length; i++ ) {
		if( n.indexOf( notesAll[ i ] + "," ) > -1 ) {
			nForMode = nForMode + ( i + 13 ) + ',';
		}
	}
	for( var i = 0; i < notesAll.length; i++ ) {
		if( n.indexOf( notesAll[ i ] + "," ) > -1 ) {
			nForMode = nForMode + ( i + 25 ) + ',';
		}
	}
	return nForMode;
}

// bigs separated by commas, no spaces
function hasMatchInBigString( bigs, smas ) {
	var sma = smas.split( ' ' );
	var m = 0;
	for( var i = 0; i < sma.length; i++ ) {
		if( i == 0 ) {
			if( bigs.indexOf( sma[ i ] + ',' ) > -1 ) {m++;}
		} else if( sma[ i ] == 'x' ) {
			m++;
		} else {
			if( bigs.indexOf( ',' + sma[ i ] + ',' ) > -1 ) {m++;}
		}
	}
	if( m == sma.length ) {
		return true;
	}
	return false;
}

function showChordFrame( name, notes ) {
	var id = new Date( ).getTime( );
	var d = document.createElement( 'div' );
	d.style.left = x + 'px';
	d.style.top = y + 'px';
	d.style.backgroundColor = 'white';
	d.style.border = '4px solid black';
	d.style.position = 'absolute';
	d.id = id;
	var ca = notes.split( / / );
	var h = '<table style="width:110px;"><tr>', val;
	h += '<tr><th colspan="6">' + name + '</th></tr>';
	h += getFrameLine( ca[ 0 ], 0, 1 );
	h += getFrameLine( ca[ 1 ], 5 );
	h += getFrameLine( ca[ 2 ], 10 );
	h += getFrameLine( ca[ 3 ], 15 );
	h += getFrameLine( ca[ 4 ], 19 );
	h += getFrameLine( ca[ 5 ], 24 );
	h += '</tr></table><div class="cffoot">' +
		'<br />R is the chord root.<br /><br />' +
		'<a href="#" onclick="hideChordFrame( \'' + id + 
		'\' );">[ close ]</a></div>'
	d.innerHTML = h;
	document.getElementById( 'out' ).appendChild( d );
}
function getFrameLine( v, offSet, isRoot ) {
	var r = '<td>';
	if( v != 'x' ) {v = v - offSet;}
	if( isRoot ) {r += getFrameLineHTML( v, isRoot );}
	else {r += getFrameLineHTML( v );}
	return r;
}
function getFrameLineHTML( v, isRoot ) {
	var r = '';
	if( v == 'x' ) {r += '<div class="cfval">X</div>';}
	else {r += '<div class="cfval">&nbsp;</div>';}
	r += '<div class="cfdash">-</div>';
	for( var i = 0; i < 8; i++ ) {// change  # to change the # of lines in frame
		if( v + 2 == i ) {//2 is offset for 4 frets before root
			if( isRoot ) {
				r += '<div class="cfval">R</div>';
			} else {
				r += '<div class="cfval">o</div>';
			}
		} else {
			r += '<div class="cfbar">|</div>';
		}
		r += '<div class="cfdash">-</div>';
	}
	return r;
}
function hideChordFrame( id ) {
	document.getElementById( 'out' ).removeChild( 
		document.getElementById( id )
	);
}


//----------------------------------------//
var rel = new Array( );
rel[ 'Ionian' ] = 		'I ii iii IV V vi vii&#176;  	| Imaj7 iim7 iiim7 IVmaj7 V7 vim7 viim7b5 	| I6 ii6 IV6 V6';
rel[ 'Dorian' ] = 		'i ii III IV v vi&#176; VII  	| im7 iim7 	IIImaj7 IV7 vm7 vim7b5 VIImaj7 	| i6 III6 IV6 VII6';
rel[ 'Phrygian' ] = 	'i II III iv v&#176; VI vii  	| im7 IImaj7 III7 ivm7 vm7b5 VImaj7 viim7 	| II6 III6 VI6 vii6';
rel[ 'Lydian' ] = 		'I II iii iv&#176; V vi vii  	| Imaj7 II7 iiim7 ivm7b5 Vmaj7 vim7 viim7 	| I6 II6 V6 vi6';
rel[ 'Mixolydian' ] = 	'I ii iii&#176; IV v vi VII  	| I7 iim7 iiim7b5 IVmaj7 vm7 vim7 VIImaj7 	| I6 IV6 v6 VII6';
rel[ 'Aeolian' ] = 		'i ii&#176; III iv v VI VII  	| im7 iim7b5 IIImaj7 ivm7 vm7 VImaj7 VII7 	| III6 iv6 VI6 VII6';
rel[ 'Locrian' ] = 		'i&#176; II iii iv V VI vii 	| im7b5 IImaj7 iiim7 ivm7 Vmaj7 VI7 viim7 	| II6 v6 V6 VI6';
rel[ 'Harmonic Major' ] = 'I+ ii III IV v&#176; vi vii&#176;';
rel[ 'Harmonic Minor' ] = 'i ii&#176; III+ iv V VI #vii&#176;';
rel[ 'Melodic Major' ] = 'I+ II III iv&#176; V&#176; vi vii';
rel[ 'Melodic Minor' ] = 'i iim III+ IV V vi&#176; vii&#176;';
rel[ 'Double Harmonic Major' ] = 'I II iii iv V&#176; VI+ II7';
rel[ 'Double Harmonic Minor' ] = 'i II&#176; III+ VI7 V VI vii';
rel[ 'Spanish Gypsy' ] = 'I II iii&#176; iv v&#176; VI+ vii';
rel[ 'Blues' ] = '&bull; same as Aeolian<br />' + rel[ 'Aeolian' ];
rel[ 'Major Pentatonic' ] = '&bull; same as Ionian<br />' + rel[ 'Ionian' ];//'I II IIIsus2 IVsus4 Vsus4 OR ' + rel[ 'Ionian' ];
rel[ 'Minor Pentatonic' ] = '&bull; same as Aeolian<br />' + rel[ 'Aeolian' ];
rel[ 'zzzzzz' ] = '';
// add modes not on  All Guitar Chords site, separate with space
var noRelMatch = 'Melodic Major Melodic Minor Double Harmonic Major Double Harmonic Minor';

function getSeeNeckHTML( m ) {
	if( noRelMatch.indexOf( m ) > -1 ) {return '';}
	var rl = 'http://www.all-guitar-chords.com/guitar_scales.php?qqq=FULL&scch=KEY&scchnam=MODE&get2=Get&choice=1';
	var k = lastKey.replace( '#/', '%23%2F' );
	k = k.replace( /#/, '%23' );
	rl = rl.replace( /KEY/, k );
	rl = rl.replace( /MODE/, m );
	return ' <a href="' + rl + '" target="_blank">See Notes Full Neck</a> ';
}
function getJamHTML( ) {
	return '<a href="http://www.all-guitar-chords.com/' +
		'guitar_chords_jam.php" target="_blank">Make ' +
		'Background Track</a>';
}
function getRelatedInfo( mode ) {
	if( rel[ mode ] ) {
		var r = ' &nbsp; &nbsp; &nbsp; &nbsp; ' + rel[ mode ];
		r = r.replace( /\|/g, '<br /> &nbsp; &nbsp; &nbsp; &nbsp; ' );
		r = r.replace( /([i|ii|iii|iv|v|vi|vii])/gi, '<b>$1</b>' );
		return '<div>Progressions: &nbsp; ' +
			getSeeNeckHTML( mode ) + ' &nbsp; &nbsp; ' + 
			getJamHTML( ) + 
			' + is for augmented 5th, &#176; is for diminished 5th or b5' +
			'<br /><span class="tab">' + r + '</span><br />' +
			'</div><br />';
	} else {
		return "";
	}
}


//----------------------------------------//
function bootStrap( m ) {
	if( !m ) {return;}
	var n = getNotes( m );
	setOutHTML(
		"<div>" + document.getElementById( 'keysel' ).value + 
		" " + m + ": " + n + "</div>" +
		"<br />" + 
		getRelatedInfo( m ) + 
		"<div>" + getChordMatches( n ) + "</div>" +
		"<div>" + getNoteImageHTML( n ) + "</div>" +
		"<div>" + getTabTextNeck( n ) + "</div>" +
		"<br />" + 
		"<table><tr><td>" +
		getTabNotePerStringPattern( n, 2 ) + 
		"</td><td>" +
		getTabNotePerStringPattern( n, 3 ) +
		"</td><td>" +
		getTabNotePerStringPattern( n, 4 ) +
		"</td></tr></table>"
	);
	document.getElementById( 'modesel' ).selectedIndex  = 0;
	selectedMode = '';
}
function bootStrapKey( ) {
	setKey( document.getElementById( 'keysel' ).value );
}
function setOutHTML( h ) {
	document.getElementById( 'out' ).innerHTML = h;
}
function resetDisplay( ) {
	setOutHTML( '' );
	document.getElementById( 'keysel' ).selectedIndex  = 3;
	document.getElementById( 'modesel' ).selectedIndex  = 0;
	selectedMode = '';
}

// from http://codingforums.com/showthread.php?t=131949
var x = 0, y = 0;
window.onload = init;
function init() {
	resetDisplay( );//added
  if (window.Event) {
    document.captureEvents(Event.MOUSEMOVE);
  }
  document.onmousemove = getXY;
}

function getXY(e) {
  x = (window.Event) ? e.pageX : event.clientX;
  y = (window.Event) ? e.pageY : event.clientY;
}
