function initLogo(logoElemId, forceFadeLogoTime)
{
    if(typeof forceFadeLogoTime == 'undefined')
    {
        forceFadeLogoTime = fadeLogoTime;
    }
    
    var logoElem = $(logoElemId);

    // start with 0 opacity
    logoElem.get('tween', {property: 'opacity', duration: 0}).start(0);
    
    setTimeout("createLogo('" + logoElemId + "', " + forceFadeLogoTime + ")", (forceFadeLogoTime * 1000));
}


function createLogo(logoElemId, forceFadeLogoTime)
{
    var logoElem = $(logoElemId);
    
    // create logo outer div, assign attributes and add to DOM
    logoElem.setStyle('display', 'block')  // make block for later
    logoElem.setStyle('width', logoXY + 'px')
    logoElem.setStyle('height', logoXY + 'px')
    logoElem.setStyle('background-color', 'rgb(' + logoBorderColour + ')')

    // create relative div for IE to position blocks correctly
    var logoInnerDiv = $(document.createElement('div'));
    logoInnerDiv.setStyle('position', 'relative')  // make block for later
    logoElem.appendChild(logoInnerDiv);

    // create default coloured block div and assign attributes (cloned later)
    var logoBlockDiv = $(document.createElement('div'));
    logoBlockDiv.setStyle('position', 'absolute')
    logoBlockDiv.setStyle('width', logoInnerXY + 'px')
    logoBlockDiv.setStyle('height', logoInnerXY + 'px')
    logoBlockDiv.setStyle('background-color', '#ffffff')
    
    // create all coloured blocks from default
    var x = 1;
    var incX = logoBorderXY;
    var incY = logoBorderXY;
    for(var y = 1; y <= logoInnerNum; y++)
    {
        if(x > logoInnerNumXY)
        {
            incX = logoBorderXY;
            incY += (logoInnerXY + logoBorderXY);
            x = 1;
        }
        
        var logoBlockDivClone = $(logoBlockDiv.cloneNode(true));
        logoBlockDivClone.setStyle('left', incX + 'px')
        logoBlockDivClone.setStyle('top', incY + 'px')
        logoBlockDivClone.id = logoElem.id + '_' + x + '_' + y;
        logoInnerDiv.appendChild(logoBlockDivClone);
        
        incX += (logoInnerXY + logoBorderXY);
        x++;
    }
    
    changeLogo(logoElemId, forceFadeLogoTime);
}


function changeLogo(logoElemId, fadeLogoTime)
{
    var logoElem = $(logoElemId);
    
    randomlyColourLogo(logoElemId);

    logoElem.get('tween', {property: 'opacity', duration: (fadeLogoTime * 1000)}).start(1);
    
    setTimeout("_changeLogo('" + logoElemId + "')", (changeLogoTime * 1000));
}


function _changeLogo(logoElemId)
{
    var logoElem = $(logoElemId);
    
    logoElem.get('tween', {property: 'opacity', duration: (fadeLogoTime * 1000)}).start(0);
    
    setTimeout("changeLogo('" + logoElemId + "', " + fadeLogoTime + ")", (fadeLogoTime * 1000));
}


function randomlyColourLogo(elem)
{
    var elem = $(elem);
    
    var x = 1;
    for(var y = 1; y <= logoInnerNum; y++)
    {
        if(x > logoInnerNumXY)
        {
            x = 1;
        }
        
        var colourElem = $(elem.id + '_' + x + '_' + y);
        if(colourElem)
        {
            var colour = '' + Math.ceil(Math.random() * 256) + ',' + Math.ceil(Math.random() * 256) + ',' + Math.ceil(Math.random() * 256) + '';
            if(randomShapeLogo && (Math.random() > 0.5))
            {
                colour = logoBorderColour;
            }	

	        colour = 'rgb(' + colour + ')';        
            colourElem.setStyle('background-color', colour)
            colourElem.setStyle('color', colour)
        }

        x++;
    }
}
