// Copyright 2009 Google Inc. 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.
 */
/**
 * @fileoverview Sample program demonstrating how to make a data request to the
 * GA Data Export API using Auth Sub authentication as well as accessing
 * important data in the feed.
 */
//-----------------------------------------------------------------
// configure GA GData API
//-----------------------------------------------------------------
var myService;
var scope = 'https://www.google.com/analytics/feeds';

/**
 * Initialize the login controls
 */
function init() {
  myService = new google.gdata.analytics.AnalyticsService('gaExportAPI_dataFeed_v1.0');
  getStatus();
}

//-----------------------------------------------------------------
// AuthSub Authentication
//-----------------------------------------------------------------
/**
 * Allow user to grant this script access to their GA data.
 */
function login() {
  google.accounts.user.login(scope);
  getStatus();
}

/**
 * Allow user to remove this script's access to their GA data.
 */
function logout() {
  google.accounts.user.logout();
  getStatus();
}

/**
 * Utility function to setup the login/logout functionality.
 */
function getStatus() {
  var status = document.getElementById('status');
  var buttonLogin = document.getElementById('buttonLogin');
  var inputP = document.getElementById('inputP');

  if (!google.accounts.user.checkLogin(scope)) {
    buttonLogin.value = 'Login';
    buttonLogin.onclick = login;
    status.innerHTML = 'You are logged out, login to continue';
    inputP.style.visibility = 'hidden';
  } else {
    buttonLogin.value = 'Logout';
    buttonLogin.onclick = logout;
    status.innerHTML = 'You are logged in';
    inputP.style.visibility = 'visible';
  }
}

//-----------------------------------------------------------------
// GA Data Feed
//-----------------------------------------------------------------
/**
 * Construct a Data Feed query and send to the GA Export API.
 */
 
 /* 
 ids  	ga:2396951
dimensions 	ga:keyword,ga:medium,ga:source
metrics 	ga:entrances,ga:newVisits,ga:pageviews
sort 	-ga:entrances
*/
function getDataFeed() {
  // first build the query
	
	var filter='';
	if($("#src_organic").attr("checked")) filter = 'ga:medium%3D%3Dorganic';
	if($("#src_cpc").attr("checked")) {
		if(filter.length) filter += ','
		filter += 'ga:medium%3D%3Dcpc'
	}
	console.log(filter);
  var myFeedUri = scope + '/data' +
    '?start-date=' + $("#startDate").val() + 
    '&end-date=' + $("#endDate").val() + 
    '&dimensions=ga:keyword,ga:medium,ga:source' +
    '&metrics=ga:entrances,ga:newVisits,ga:pageviews,ga:bounces,ga:transactionRevenue,ga:goalStartsAll,ga:goalCompletionsAll' +
    '&sort=-ga:entrances' +
    '&filters=' + filter + 
    '&max-results=' + $("#count").val() + 
    '&ids=ga:' + document.getElementById('inputProfileId').value;

  // Send our request to the Analytics API and wait for the results to come back
  myService.getDataFeed(myFeedUri, handleDataFeed, handleError);
}

/**
 * Handle and display any error that occurs from the API request.
 * @param {Object} e The error object returned by the Analytics API.
 */
function handleError(e) {
  var error = 'There was an error!\n';
  if (e.cause) {
    error += e.cause.statusText;
  } else {
    error += e.message;
  }
  alert(error);
}

/**
 * Handle the data the API returns. Then output the data to the screen.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 */
function handleDataFeed(myResultsFeedRoot) {
	keywordCloud.init();

	outputFeedData(myResultsFeedRoot);
  //outputFeedDataSources(myResultsFeedRoot);
  //outputFeedAggregates(myResultsFeedRoot);
  //outputEntryRowData(myResultsFeedRoot);

  var tableData = getFeedTable(myResultsFeedRoot);
  document.getElementById('entryTable').innerHTML = tableData;

  document.getElementById('outputData').style.visibility = 'visible';
	keywordCloud.generate();
}

//-----------------------------------------------------------------
// Format Feed Related Data
//-----------------------------------------------------------------
/**
 * Output the information specific to the feed.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 */
function outputFeedData(myResultsFeedRoot) {
  var feed = myResultsFeedRoot.feed;
  var feedString = [
    'Feed Title      = ' + feed.getTitle().getText(),
    'Feed Id         = ' + feed.getId().getValue(),
    'Total Results   = ' + feed.getTotalResults().getValue(),
    'Start Index     = ' + feed.getStartIndex().getValue(),
    'Items Per Page  = ' + feed.getItemsPerPage().getValue(),
    'Start Date      = ' + feed.getStartDate().getValue(),
    'End Date        = ' + feed.getEndDate().getValue()
  ].join('\n');
  document.getElementById('feedDataPre').innerHTML = feedString;
}

/**
 * Output information about the data sources in the feed.
 * Note: the GA Export API currently has exactly one data source.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 */
function outputFeedDataSources(myResultsFeedRoot) {
  var feed = myResultsFeedRoot.feed;
  var gaDataSource = feed.getDataSources()[0];
  var dataSourceString = [
    'Table Name      = ' + gaDataSource.getTableName().getValue(),
    'Table Id        = ' + gaDataSource.getTableId().getValue(),
    'Web Property Id = ' + gaDataSource.getPropertyValue('ga:webPropertyId'),
    'Profile Id      = ' + gaDataSource.getPropertyValue('ga:profileId'),
    'Account Name    = ' + gaDataSource.getPropertyValue('ga:accountName')
  ].join('\n');
  document.getElementById('dataSourcePre').innerHTML = dataSourceString;
}

/**
 * Output all the metric names and values of the aggregate data.
 * The aggregate metrics represent values across all of the entries selected
 *     by the query and not just the rows returned.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 */
function outputFeedAggregates(myResultsFeedRoot) {
  var feed = myResultsFeedRoot.feed;
  var aggregateString = '';
  var aggregates = feed.getAggregates().getMetrics();
  for (var idx = 0; idx < aggregates.length; idx++) {
    aggregateString = [
      'Metric Name     = ' + aggregates[idx].getName(),
      'Metric Value    = ' + aggregates[idx].getValue(),
      'Metric Type     = ' + aggregates[idx].getType(),
      'Metric CI       = ' + aggregates[idx].getConfidenceInterval()
    ].join('\n');
    document.getElementById('aggregatesPre').innerHTML +=
      ['<div>', aggregateString, '</div>'].join('');
  }
}

/**
 * Output all the important information from the first entry in the data feed.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 */
function outputEntryRowData(myResultsFeedRoot) {
  var entries = myResultsFeedRoot.feed.getEntries();
  if (entries.length == 0) {
    document.getElementById('entryIdPre').innerHTML = 'No entries found';
    return;
  }

  var entry = entries[0];
  var entryString = '';

  // properties specific to all the entries returned in the feed
  document.getElementById('entryIdPre').innerHTML = [
    'Entry Id        = ' + entry.getId().getValue(),
    'Entry Title     = ' + entry.getTitle().getText()
  ].join('\n');

  // iterate through all the dimensions
  var dimensions = entry.getDimensions();
  for (var idx = 0; idx < dimensions.length; idx++) {
    entryString = [
      'Dimension Name  = ' + dimensions[idx].getName(),
      'Dimension Value = ' + dimensions[idx].getValue()
    ].join('\n');
    document.getElementById('entryDimensionsPre').innerHTML =
      ['<div>', entryString, '</div>'].join('');
  }

  // iterate through all the metrics
  var metrics = entry.getMetrics();
  for (var idx = 0; idx < metrics.length; idx++) {
    entryString = [
      'Metric Name     = ' + metrics[idx].getName(),
      'Metric Value    = ' + metrics[idx].getValue(),
      'Metric Type     = ' + metrics[idx].getType(),
      'Metric CI       = ' + metrics[idx].getConfidenceInterval()
    ].join('\n');
    document.getElementById('entryMetricsPre').innerHTML =
    ['<div>', entryString, '</div>'].join('');
  }
}

/**
 * Get the data feed values into an HTML table.
 * @param {Object} myResultsFeedRoot Parameter passed
 *     back from the feed handler.
 * @return {String} This returns the contents of a table.
 */
function getFeedTable(myResultsFeedRoot) {
  var entries = myResultsFeedRoot.feed.getEntries();
  if (entries.length == 0) {
    return '<tr><td>No entries found</td></tr>';
  }
  var entry = entries[0];
  var dimensions = entry.getDimensions();
  var metrics = entry.getMetrics();
  var tableData = [];
  var tableNames = [];

  // put all the dimension and metric names into an array
  for (var idx = 0; idx < dimensions.length; idx++) {
    tableNames.push(dimensions[idx].getName());
  }
  for (var idx = 0; idx < metrics.length; idx++) {
    tableNames.push(metrics[idx].getName());
  }

  // put all the names into the header row of the table
  tableData.push('<tr><th>', tableNames.join('</th><th>'), '</th></tr>');

  // put the values of the dimension and metric names into the table
  for (var jdx = 0; jdx < entries.length; jdx++) {
    entry = entries[jdx];
		console.log("Processing " + jdx );
    tableData.push('<tr>');
    for (var idx = 0; idx < tableNames.length; idx++) {
				console.log("Processing td " + dimensions[idx] );
				if(tableNames[idx] !== 'undefined' && tableNames[idx]) {
					tableData.push('<td class="' + tableNames[idx].replace(":","_") + '">', entry.getValueOf(tableNames[idx]), '</td>');				
				} else {
					tableData.push('<td class="">', entry.getValueOf(tableNames[idx]), '</td>');
		}
		}
    tableData.push('</tr>');
  }
  return tableData.join('');
}

// Load the Google data JavaScript client library
google.load('gdata', '1.x');

// Set the callback function when the library is ready
google.setOnLoadCallback(init);
