// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/**
 * In order to use this library import the `usage_html.dart` file and
 * instantiate the [AnalyticsHtml] class.
 *
 * You'll need to provide a Google Analytics tracking ID, the application name,
 * and the application version.
 */
library usage_html;

import 'dart:html';

import 'src/usage_impl.dart';
import 'src/usage_impl_html.dart';

export 'usage.dart';

/**
 * An interface to a Google Analytics session, suitable for use in web apps.
 *
 * [analyticsUrl] is an optional replacement for the default Google Analytics
 * URL (`https://www.google-analytics.com/collect`).
 */
class AnalyticsHtml extends AnalyticsImpl {
  AnalyticsHtml(String trackingId, String applicationName, String applicationVersion, {
    String analyticsUrl
  }) : super(
      trackingId,
      new HtmlPersistentProperties(applicationName),
      new HtmlPostHandler(),
      applicationName: applicationName,
      applicationVersion: applicationVersion,
      analyticsUrl: analyticsUrl
  ) {
    int screenWidth = window.screen.width;
    int screenHeight = window.screen.height;

    setSessionValue('sr', '${screenWidth}x$screenHeight');
    setSessionValue('sd', '${window.screen.pixelDepth}-bits');
    setSessionValue('ul', window.navigator.language);
  }
}
