﻿//
// SharpSpell v3.0 - Copyright (c) 2006 Tachyon Labs (tachyon-labs.com)
//
// Real-time spell-as-you-type for the web spell checker.
// For more information, visit http://www.tachyon-labs.com/sharpspell/
//

var SharpSpellMenu = { };

SharpSpellMenu.ShowMenu = function (el, callback)
{ 
    // prevent default action (showing context menu)
	var owner = el;
	SharpSpellMenu.MenuOwner = owner;
	    
    // split the suggestions into an array
	var menuItems = owner.getAttribute("suggestions");
	    		
	var menuItemsCol = [ ];
	if (menuItems.length == 0) {
	    menuItemsCol.push( "No suggestions;NoSuggestions" ); 
	} else {
	    menuItemsCol = menuItems.split(";");	
	}
	    
	// limit the menu to a maximum of 15 suggestions
	menuItemsCol.splice(15, 100);
	
	menuItemsCol.push( "-;Separator" ); 
	menuItemsCol.push( "Ignore;Ignore" ); 
	menuItemsCol.push( "Add to Dictionary;AddToDictionary" ) ; 
	menuItemsCol.push( "Clear Dictionary;ClearCustom" ) ; 

    if (!SharpSpellMenu.MenuDiv)
    {
        SharpSpellMenu.MenuDiv = document.createElement("div") ;
        SharpSpellMenu.MenuDiv.id = "SharpSpell_MenuContainer";
        SharpSpellMenu.MenuDiv.style.position = 'absolute';
        SharpSpellMenu.MenuDiv.style.zIndex = '100';
        SharpSpellMenu.MenuDiv.style.width = '180px';
        document.body.appendChild(SharpSpellMenu.MenuDiv);
    }
    else 
    {
        while ( SharpSpellMenu.MenuDiv.firstChild ) { SharpSpellMenu.MenuDiv.removeChild(SharpSpellMenu.MenuDiv.firstChild); }
    }
    var treeOwner;
    
	//<table class='SharpSpell_MenuTableOuter' cellpadding='0' cellspacing='0' width='100' border='0'>
    var outerTable;
    outerTable = document.createElement("div");
    outerTable.className = 'SharpSpell_MenuTableOuter';

    SharpSpellMenu.MenuDiv.appendChild(outerTable);    
    
	//<table class='SharpSpell_MenuTableInner' cellpadding='0' cellspacing='0' width='100%' border='0'
    var innerTable;
    innerTable = document.createElement("div");
    innerTable.className = 'SharpSpell_MenuTableInner';
    
    outerTable.appendChild(innerTable);
	
	//<table cellpadding='0' cellspacing='0' width='100%' border='0'>
    var contentTable;
    contentTable = document.createElement("div");

    innerTable.appendChild(contentTable);
	
	
	// add menu items
	for( var i = 0; i < menuItemsCol.length; i++ )
	{   
	    var menuItem = unescape(menuItemsCol[i]);
        
	    if (menuItem.split(";")[0] != "-") {
	    /*
	        "<div class='SharpSpell_MenuItemBar SharpSpell_MenuItem' "
				    + " onclick='javascript: SharpSpell_HandleItemClick( \"" + menuItem + "\", SharpSpell_HandleMenuClick ) ;" 
				    + " event.cancelBubble = true ; '"
				    + " onmouseout='javascript: SharpSpell_MenuItemOver(this, \"out\") ; "
				    + " document.onmousedown = SharpSpell_HandleDocumentClick ;' "
				    + " onmouseover='javascript: SharpSpell_MenuItemOver(this, \"over\") ; "
				    + " document.onmousedown = null;'"
				    + ">" + menuItem.split(";")[0] + "</div>" ;
				    */
		    var itemDiv;
		    itemDiv = document.createElement("div");
		    itemDiv.className = "SharpSpell_MenuItemBar SharpSpell_MenuItem";
		    itemDiv.appendChild(document.createTextNode(menuItem.split(";")[0]));
            itemDiv.setAttribute("itemData", menuItem);
		    itemDiv.onmouseup = 
                function (e) 
                { 
                    e = e ? e : window.event;
	                var self;
	                if (e.target) { self = e.target; }
	                if (e.srcElement) { self = e.srcElement; }
                    
                    SharpSpellMenu.HandleItemClick(self.getAttribute("itemData"), callback); 
                } ;
 		    itemDiv.onmouseout = 
                function (e) 
                { 
                    e = e ? e : window.event;
	                var self;
	                if (e.target) { self = e.target; }
	                if (e.srcElement) { self = e.srcElement; }
                    
                    SharpSpellMenu.MenuItemOver(self, "out"); 
                    document.onmousedown = SharpSpellMenu.HandleDocumentClick; 
                } ;
           itemDiv.onmouseover = 
                function (e) 
                { 
                    e = e ? e : window.event;
	                var self;
	                if (e.target) { self = e.target; }
	                if (e.srcElement) { self = e.srcElement; }
                    
                    SharpSpellMenu.MenuItemOver(self, "over"); 
                    document.onmousedown = null; 
                } ;
                
           itemDiv.onmousedown = function () { return false; };
           itemDiv.onselectstart = function () { return false; };
		    
		   contentTable.appendChild(itemDiv);    
	    }
	    else 
	    {
	        //<div class='SharpSpell_MenuItem'><div class='SharpSpell_MenuSeparator'></div></div>
	        var itemDiv, sepDiv;
	        itemDiv = document.createElement("div");
	        itemDiv.className = "SharpSpell_MenuItem";
	        sepDiv = document.createElement("div");
	        sepDiv.className = "SharpSpell_MenuSeparator";
	        itemDiv.appendChild(sepDiv);
	        contentTable.appendChild(itemDiv);
	    }
	}
    
    var mousePos = SharpSpell.getMousePos();
    var scrollPos = SharpSpell.getScrollXY();
    var size = SharpSpell.getWindowSize();
    SharpSpellMenu.MenuDiv.style.left =  scrollPos.x + mousePos.x + 'px';
    SharpSpellMenu.MenuDiv.style.top = scrollPos.y + mousePos.y + 'px';

    if (mousePos.y + SharpSpellMenu.MenuDiv.offsetHeight > size.height + scrollPos.y )
    {
        SharpSpellMenu.MenuDiv.style.top = scrollPos.y + size.height - SharpSpellMenu.MenuDiv.offsetHeight - 5 + 'px';
    }
    
    if (mousePos.x + SharpSpellMenu.MenuDiv.offsetWidth > size.width + scrollPos.x )
    {
        SharpSpellMenu.MenuDiv.style.left = scrollPos.x + size.width - SharpSpellMenu.MenuDiv.offsetWidth - 5 + 'px';
    }
    
    SharpSpellMenu.MenuDiv.style.visibility = 'visible';

    window.document.onmousedown = SharpSpellMenu.HandleDocumentClick ;
    window.document.onkeydown = SharpSpellMenu.HandleDocumentClick ;

};

SharpSpellMenu.HandleItemClick = function ( clickedItem, callback )
{
    if (SharpSpellMenu.MenuDiv)
    {
        SharpSpellMenu.MenuDiv.style.visibility = 'hidden';
        SharpSpellMenu.MenuDiv.style.left = '-100px';
        SharpSpellMenu.MenuDiv.style.top = '-100px';      
    }
    callback( clickedItem, SharpSpellMenu.MenuOwner ) ;
};

SharpSpellMenu.HandleDocumentClick = function ()
{
    if (SharpSpellMenu.MenuDiv)
    {
        SharpSpellMenu.MenuDiv.style.visibility = 'hidden';
        SharpSpellMenu.MenuDiv.style.left = '-100px';
        SharpSpellMenu.MenuDiv.style.top = '-100px';      
    }
};

SharpSpellMenu.MenuItemOver = function ( e, dir )
{
	if ( dir == "over" ) {
		e.className = "SharpSpell_MenuItemBar_Over SharpSpell_MenuItem" ;
	} else {
		e.className = "SharpSpell_MenuItemBar SharpSpell_MenuItem" ;
	}
};

