API Server

The APIServer function generates a hostname for the API server by adding 'api-' to the current domain name after removing the prefix 'www.', if present. If SSL is being used, the returned port is 8443; other 8080.

APIServer = Resolve;

function Resolve()
{
    var base_domain = Resolve.ExtractBaseDomain( location.hostname );
	var dom         = "";
    var http_port   = Resolve.httpPort  ? Resolve.httpPort  : "80";
    var https_port  = Resolve.httpsPort ? Resolve.httpsPort : "443";
        https_port  = Resolve.IsLocalAPIServer() ? "8443" : https_port;

	switch ( location.protocol )
	{
	case "http:":
		dom = location.protocol + "//api" + base_domain + ":" + http_port;
		break;

	case "https:":
        dom = location.protocol + "//api" + base_domain + ":" + https_port;
		break;
	}

	return dom;
}

Resolve.ExtractBaseDomain
=
function( domain )
{
	var base_domain = "";
	var bits = domain.split( "-" );
	
	if ( 1 == bits.length )
	{
		base_domain = bits[0];
	}
	else
	{
		base_domain = bits[1];
	}

    //  If base_domain == 'example.com'
    if ( Resolve.IsRegisteredDomain( base_domain ) )
    {
        //  Then return '.example.com'
        base_domain = "." + base_domain;
    }
    else    // If base_domain == 'myapp.example.com'
    {
        //  Then return '-myapp.example.com'
        base_domain = "-" + base_domain;
    }

	return base_domain;
}

Resolve.IsLocalAPIServer
=
function()
{
    return (-1 !== location.hostname.indexOf( ".local" ));
}

Resolve.IsRegisteredDomain
=
function( domain )
{
    //  First remove '.local' if it is on domain.
    domain = domain.replace( ".local", "" );

    //  Could be:
    //
    //  1)           example            returns false
    //  2)           example.com        returns true
    //  3)           example.com.au     returns true
    //  4)  mydomain.example.com        returns false
    //  5)  mydomain.example.com.au     returns false

    var bits = domain.split( "." );

    switch ( bits.length )
    {
    case 1:
        //  Is an invalid domain so return false.
        return false;

    case 2:
        //  Is a registered domain if last bit is a TLD.
        return Resolve.IsTopLevelDomain( bits[1] );

    case 3:
        //  Is a registered domain if last bit is a TLD.
        return Resolve.IsSecondLevelDomainOf( bits[1], bits[2] );

    default:
        //  Any with more will not be registered domain.
        return false;
    }
}

Resolve.IsTopLevelDomain
=
function( tld )
{
    switch( tld )
    {
    case "com":
    case "net":
    case "online":
    case "org":
    case "xyz":
        return true;

    default:
        return false;
    }
}

Resolve.IsSecondLevelDomainOf
=
function( sld, tld )
{
    switch( tld )
    {
    case "au":
        switch ( sld )
        {
        case "com":
        case "net":
        case "org":
        case "info":
            return true;

        default:
            return false;
        }
        break;

    default:
        return false;
    }
}