// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

var cssFile = document.createElement('link');
cssFile.setAttribute('rel', 'stylesheet');
cssFile.setAttribute('type', 'text/css');
cssFile.setAttribute('href', 'layer_sun.css');
document.getElementsByTagName("head")[0].appendChild(cssFile)

function CreateSunBlade(className, duration, delay) {
  var sunBladeElement = document.createElement('div');
  sunBladeElement.className = className;
  sunBladeElement.style.animationDuration =
      duration + 's, 0.4s';
  sunBladeElement.style.animationDelay = -delay + 's, ' + -duration + 's';
  return sunBladeElement;
}

function CreateSunElement(durationMultiplier) {
  var sunBladeScaleContainerElement = document.createElement('div');
  sunBladeScaleContainerElement.className = 'sun-blade-scale-container';

  var NUM_SUN_BLADE_ELEMENTS = 3;
  var rotationPeriodInSeconds = 4 * durationMultiplier;
  var sunBladeSpacing =
      (1.0 / NUM_SUN_BLADE_ELEMENTS) * rotationPeriodInSeconds;

  for (var i = 0; i < NUM_SUN_BLADE_ELEMENTS; ++i) {
    var sunBladeElement = CreateSunBlade(
        'sun-blade-dark',
        rotationPeriodInSeconds, i * sunBladeSpacing + 0.25 * sunBladeSpacing);
    sunBladeScaleContainerElement.appendChild(sunBladeElement);
  }

  for (var i = 0; i < NUM_SUN_BLADE_ELEMENTS; ++i) {
    var sunBladeElement = CreateSunBlade(
        'sun-blade-light',
        rotationPeriodInSeconds, i * sunBladeSpacing);

    sunBladeScaleContainerElement.appendChild(sunBladeElement);
  }

  return sunBladeScaleContainerElement;
}

function InitializeSunLayer(layerElement) {
  var sunBladeLayerContainerElement = document.createElement('div');
  sunBladeLayerContainerElement.className = 'sun-blade-layer-container';

  var parentElement = sunBladeLayerContainerElement;
  var durationMultiplier = 1.0;
  var NUM_SUNS = 7;
  for (var i = 0; i < NUM_SUNS; ++i) {
    sunElement = CreateSunElement(durationMultiplier);
    parentElement.appendChild(sunElement);
    parentElement = sunElement;
    durationMultiplier *= 0.8;
  }
  layerElement.appendChild(sunBladeLayerContainerElement);
}

