function createProtocolManager()
{
	var sp = new server_pool();
	sp.add_server("jsp/gis_http_bridge.jsp");
	
	var protocolManager = new v4_protocol_manager();
	protocolManager.server_pool = sp;
	
	return protocolManager
}

function Overlap (g1, g2)
{
    var gPrc          = new GelProcessor (createProtocolManager());
    return gPrc.Overlap (g1, g2);
}


function Extend (g1, g2)
{
    var gPrc          = new GelProcessor (createProtocolManager());
    return gPrc.Extend (g1, g2);
}

function Buffer (g1, g2)
{
    var gPrc          = new GelProcessor (createProtocolManager());
    return gPrc.Buffer (g1, g2);
}


function Subtract (g1, g2)
{
    var gPrc          = new GelProcessor (createProtocolManager());
    return gPrc.Subtract(g1, g2);
}



// Ricava un gel lineare ripercorrendo il contorno del gel areale
function LineFromArea (gelAreale)
{
    var gelLineare = new geometry(geometry_type.LINE, point_type.PROJECTED);
    
    for (var i = gelAreale.get_iterator(); i.move_next (); )
    {
		var newPart = gelLineare.append_part();

        for (var p = i.get_current().get_iterator(); p.move_next (); )
		    newPart.append_point(p.get_current());
    }
    return gelLineare;
}

function NegativeBuffer (gel, radius, angle)
{
    // dimezzo il raggio del buffer sull'elemento areale
    // così evito che facendo la sottrazione restino schisi
    var bufGelArea = Buffer (gel, radius * 0.5, angle);
    
    // il buffer sull'elemento lineare è quello reale poichè
    // è quello che determina la dimensione del buffer interno
    var bufGelLine = Buffer (LineFromArea(gel), radius, angle);
    
    // sottraggo il buffer lineare da quello areale per
    // ottenere il buffer interno all'area, infatti il
    // buffer lineare è sia interno che esterno
    return  Subtract (bufGelArea, bufGelLine);
}



function InsiemiSfumati (g1, g2, g3, LimitConstant, MaximumRadius)
{
    var Area = Math.abs(g1.get_area());
    
    // Calcolo il raggio del buffer come il 1% del raggio
    // del cerchio con area equivalente
    var Raggio = Math.sqrt(Area / Math.PI) * LimitConstant;
    
    // Se il raggio risulta > 0.8 lo riduco a 0.8
    if (Raggio > MaximumRadius) 
        Raggio = MaximumRadius;
    
    var g4 = NegativeBuffer (g1, Raggio, 45);
    g4 = (g4 == null) ? g2 : g4;
    
    // Controllo nuovamente se c'è l'intersezione
    return (Overlap (g4, g3) != null)
}

function expandedMbrFromPoint (p, distance, origin_left_top)
{
    var d = distance / 2;
    var newX = p.x - d;
    var newY = (origin_left_top ? p.y-d : p.y+d);
        
    return new rect (newX, newY, distance, distance, origin_left_top);
}
