        var dragObject     = null;
        var MOVING_TOP ;
        var STILL_TOP ;
        var LETTER_WIDTH ;
        var PIXELS_BETWEEN_LETTERS ;
        var mouseStartCoords ;
        var holderDiv;
        var START_X ;
        var puzzleWord ;
        var guessWord ;
        var BLANK_INDICATOR_CHAR = "|";
        var curBlankPos ;
        var downLetterClass ;

            function initScript() {
		document.onmousemove = mouseMove;
     		document.onmouseup = mouseUp;
		holderDiv = document.getElementById( "letterHolderDiv" );
	    }

	    function setPuzzleWord( word )
	    {
                 removeChildren( holderDiv );
                 word = word.toUpperCase();
	         puzzleWord = word ;
                 initDimensions( word.length );

		 guessWord = scramble( word );
	         placeLetters( guessWord );
	    }

            function initDimensions( wordLength ) {
                if ( wordLength <= 7 ) {
                   MOVING_TOP = "-30px";
                   STILL_TOP = "50px";
                   LETTER_WIDTH = 67;
                   PIXELS_BETWEEN_LETTERS = 20;
                   downLetterClass = "wsLetter";
                }
                else {
                   MOVING_TOP = "0px";
                   STILL_TOP = "75px" ;
                   LETTER_WIDTH = 45;
                   PIXELS_BETWEEN_LETTERS = 12;
                   downLetterClass = "wsLetter smallLetter";
                }
            }

	    function scramble( word )
	    {
	    	for ( var i=0; i<3; i++ ) {
				for ( var j=0; j<word.length; j++ ) {
					var r = Math.floor( Math.random() * word.length );
					word = swapLetters( word, j, r );
				}
	    	}
	    	return word ;
	    }

	    function swapLetters( word, pos1, pos2 ) {
	    	if ( pos1 == pos2 ) return word ;
	    	var char1 = word.charAt( pos1 );
	    	var char2 = word.charAt( pos2 );
	    	word = setCharAt( word, pos1, char2 );
	    	word = setCharAt( word, pos2, char1 );
	    	return word;
	    }

		function setCharAt( word, pos, ch ) {
			return word.substr( 0, pos ) + ch + word.substr( pos + 1 );
		}

		function mouseCoords(ev){
			if(ev.pageX || ev.pageY){
				return {x:ev.pageX, y:ev.pageY};
			}
			return {
				x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
				y:ev.clientY + document.body.scrollTop  - document.body.clientTop
			};
		}


		function makeDraggable(item){
		    if(!item) return;
			item.onmousedown = function(ev){
                        ev = ev || window.event;
		        dragObject  = this;
		        dragObject.originalTop = parseInt( dragObject.style.top );
	                dragObject.originalLeft = parseInt( dragObject.style.left );
                        dragObject.className = downLetterClass + " upLetter" ;
			dragObject.style.top = MOVING_TOP;
//			dragObject.style['background-image'] = "url('scrabble_tile_up.jpg')";
			mouseStartCoords = mouseCoords( ev );
			curBlankPos = calcPosition( dragObject.originalLeft );
                        guessWord = guessWord.substring( 0, curBlankPos ) + BLANK_INDICATOR_CHAR + guessWord.substring( curBlankPos + 1 );
			return false;
	            }
		}

		function mouseMove(ev){

         	if ( dragObject ){
	        	ev = ev || window.event;
	         	var mousePos = mouseCoords(ev);
				dragObject.style.position = 'absolute';
				dragObject.style.left  = dragObject.originalLeft + (mousePos.x - mouseStartCoords.x );
				var newBlankPos = calcPosition( dragObject.style.left ) ;
				if ( newBlankPos != curBlankPos ) {
				     curBlankPos = newBlankPos ;
				     moveBlank( newBlankPos );
				}

				return false;
			}
		}

        function mouseUp(ev){
        	ev = ev || window.event;
        	if ( dragObject != null ) {
			var dragChar = dragObject.innerHTML ;
                        if ( dragChar.length < 1 ) { 
                            dragChar = ' '; 
                        }
			dragObject.style.top = STILL_TOP ;
                        dragObject.className = downLetterClass  ;

	        	dragObject = null;
	        	if ( curBlankPos != -1 ) {
                    guessWord = guessWord.substring( 0, curBlankPos ) + dragChar + guessWord.substring( curBlankPos + 1 );
                    if ( guessWord == puzzleWord ) {
                    	PIXELS_BETWEEN_LETTERS = 3;
                        showYouWon();
                    }
                    placeLetters( guessWord );
	        	}
	        }
        }

        function moveBlank( newPos ) {

            // remove blank
            var blankPos = guessWord.indexOf( BLANK_INDICATOR_CHAR );
            if ( blankPos >= 0 ) {
                 guessWord = guessWord.substring( 0, blankPos ) + guessWord.substring( blankPos + 1 );
            }
            guessWord = guessWord.substring( 0, newPos ) + BLANK_INDICATOR_CHAR + guessWord.substring( newPos  );
            placeLetters( guessWord );
        }

        function placeLetters( word ) {

           resetUsedFlag();

           // calculate position of first letter
           // such that letters end up centered within the holderDiv
           START_X = (holderDiv.clientWidth / 2) -
                         ( (puzzleWord.length * LETTER_WIDTH + (puzzleWord.length - 1) * PIXELS_BETWEEN_LETTERS) / 2 );
           var x = START_X ;
           for ( var i=0; i<word.length; i++ ) {
               var letter = word.charAt( i );
               if ( letter != BLANK_INDICATOR_CHAR ) {
                  moveLetterDiv( letter, x );
 	       }
               x += ( LETTER_WIDTH + PIXELS_BETWEEN_LETTERS );
	   }
        }


        function resetUsedFlag() {
            var child = holderDiv.firstChild ;
            while ( child != null ) {
                  child.used = false ;
                  child = child.nextSibling ;
            }
        }


        function moveLetterDiv( letter, x ) {
            var child = holderDiv.firstChild ;
            while ( child != null ) {
                  var childLetter = child.innerHTML ;
                  if ( childLetter.length == 0 ) {
                     childLetter = ' ';
                  }
                  if ( childLetter == letter && !child.used && child != dragObject ) {
                      child.used = true ;
                      child.style.left = x + "px";
                      return child ;
                  }
                  child = child.nextSibling ;
            }
            return makeLetterDiv( letter, x );
        }


        function makeLetterDiv( letter, x ) {
           var div = document.createElement( "div" );
           //alert( 'make letter div letter=' + letter + '   x=' + x );
           div.className = downLetterClass ;
           div.style.left = x + "px";
           div.innerHTML = letter ;
           div.used = true ;
           makeDraggable(div);
           holderDiv.appendChild( div );
        }


        function calcPosition( left )
        {
             var x = parseInt( left ) ;
             x = x + (LETTER_WIDTH + PIXELS_BETWEEN_LETTERS)/2;
             var pos = parseInt( (x - START_X) / (LETTER_WIDTH + PIXELS_BETWEEN_LETTERS ) );
             if (pos<0) {
                 pos = 0 ;
             }
             else if ( pos >= puzzleWord.length ) {
                 pos = puzzleWord.length - 1;
             }
             return pos ;
        }

        function removeChildren( container ) {
            var child = container.firstChild;
            while ( child != null ) {
                var nextChild = child.nextSibling ;
			    if ( child != dragObject ) {
					container.removeChild( child );
				}
				child = nextChild ;
			}
        }



