new analytics api samples. Reviewed here: http://codereview.appspot.com/5494058/
Fixes issue #5494058
diff --git a/samples/analytics/client_secrets.json b/samples/analytics/client_secrets.json
new file mode 100644
index 0000000..323ffd0
--- /dev/null
+++ b/samples/analytics/client_secrets.json
@@ -0,0 +1,9 @@
+{
+  "installed": {
+    "client_id": "[[INSERT CLIENT ID HERE]]",
+    "client_secret": "[[INSERT CLIENT SECRET HERE]]",
+    "redirect_uris": [],
+    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+    "token_uri": "https://accounts.google.com/o/oauth2/token"
+  }
+}
diff --git a/samples/analytics/core_reporting_v3_reference.py b/samples/analytics/core_reporting_v3_reference.py
new file mode 100755
index 0000000..6132263
--- /dev/null
+++ b/samples/analytics/core_reporting_v3_reference.py
@@ -0,0 +1,255 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2012 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.
+
+"""Reference command-line example for Google Analytics Core Reporting API v3.
+
+This application demonstrates how to use the python client library to access
+all the pieces of data returned by the Google Analytics Core Reporting API v3.
+
+The application manages autorization by saving an OAuth2.0 token in a local
+file and reusing the token for subsequent requests.
+
+Before You Begin:
+
+Update the client_secrets.json file
+
+  You must update the clients_secrets.json file with a client id, client
+  secret, and the redirect uri. You get these values by creating a new project
+  in the Google APIs console and registering for OAuth2.0 for installed
+  applications: https://code.google.com/apis/console
+
+  Learn more about registering your analytics application here:
+  http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html
+
+Supply your TABLE_ID
+
+  You will also need to identify from which profile to access data by
+  specifying the TABLE_ID constant below. This value is of the form: ga:xxxx
+  where xxxx is the profile ID. You can get the profile ID by either querying
+  the Management API or by looking it up in the account settings of the
+  Google Anlaytics web interface.
+
+Sample Usage:
+
+  $ python core_reporting_v3_reference.py
+
+Also you can also get help on all the command-line flags the program
+understands by running:
+
+  $ python core_reporting_v3_reference.py --help
+"""
+
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
+
+import sys
+import sample_utils
+
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+
+
+# The table ID is used to identify from which Google Anlaytics profile
+# to retrieve data. This ID is in the format ga:xxxx where xxxx is the
+# profile ID.
+TABLE_ID = 'INSERT_YOUR_TABLE_ID_HERE'
+
+
+def main(argv):
+  sample_utils.process_flags(argv)
+
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
+
+  # Try to make a request to the API. Print the results or handle errors.
+  try:
+    results = get_api_query(service).execute()
+    print_results(results)
+
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
+  except HttpError, error:
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
+
+  except AccessTokenRefreshError:
+    # Handle Auth errors.
+    print ('The credentials have been revoked or expired, please re-run '
+           'the application to re-authorize')
+
+
+def get_api_query(service):
+  """Returns a query object to retrieve data from the Core Reporting API.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+  """
+
+  return service.data().ga().get(
+      ids=TABLE_ID,
+      start_date='2012-01-01',
+      end_date='2012-01-15',
+      metrics='ga:visits',
+      dimensions='ga:source,ga:keyword',
+      sort='-ga:visits',
+      filters='ga:medium==organic',
+      start_index='1',
+      max_results='25')
+
+
+def print_results(results):
+  """Prints all the results in the Core Reporting API Response.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print_report_info(results)
+  print_pagination_info(results)
+  print_profile_info(results)
+  print_query(results)
+  print_column_headers(results)
+  print_totals_for_all_results(results)
+  print_rows(results)
+
+
+def print_report_info(results):
+  """Prints general information about this report.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Report Infos:'
+  print 'Contains Sampled Data = %s' % results.get('containsSampledData')
+  print 'Kind                  = %s' % results.get('kind')
+  print 'ID                    = %s' % results.get('id')
+  print 'Self Link             = %s' % results.get('selfLink')
+  print
+
+
+def print_pagination_info(results):
+  """Prints common pagination details.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Pagination Infos:'
+  print 'Items per page = %s' % results.get('itemsPerPage')
+  print 'Total Results  = %s' % results.get('totalResults')
+
+  # These only have values if other result pages exist.
+  if results.get('previousLink'):
+    print 'Previous Link  = %s' % results.get('previousLink')
+  if results.get('nextLink'):
+    print 'Next Link      = %s' % results.get('nextLink')
+  print
+
+
+def print_profile_info(results):
+  """Prints information about the profile.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Profile Infos:'
+  info = results.get('profileInfo')
+  print 'Account Id      = %s' % info.get('accountId')
+  print 'Web Property Id = %s' % info.get('webPropertyId')
+  print 'Profile Id      = %s' % info.get('profileId')
+  print 'Table Id        = %s' % info.get('tableId')
+  print 'Profile Name    = %s' % info.get('profileName')
+  print
+
+
+def print_query(results):
+  """The query returns the original report query as a dict.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Query Parameters:'
+  query = results.get('query')
+  for key, value in query.iteritems():
+    print '%s = %s' % (key, value)
+  print
+
+
+def print_column_headers(results):
+  """Prints the information for each column.
+
+  The main data from the API is returned as rows of data. The column
+  headers describe the names and types of each column in rows.
+
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Column Headers:'
+  headers = results.get('columnHeaders')
+  for header in headers:
+    # Print Dimension or Metric name.
+    print '\t%s name:    = %s' % (header.get('columnType').title(),
+                                  header.get('name'))
+    print '\tColumn Type = %s' % header.get('columnType')
+    print '\tData Type   = %s' % header.get('dataType')
+    print
+
+
+def print_totals_for_all_results(results):
+  """Prints the total metric value for all pages the query matched.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Total Metrics For All Results:'
+  print 'This query returned %s rows.' % len(results.get('rows'))
+  print ('But the query matched %s total results.' %
+         results.get('totalResults'))
+  print 'Here are the metric totals for the matched total results.'
+  totals = results.get('totalsForAllResults')
+
+  for metric_name, metric_total in totals.iteritems():
+    print 'Metric Name  = %s' % metric_name
+    print 'Metric Total = %s' % metric_total
+    print
+
+
+def print_rows(results):
+  """Prints all the rows of data returned by the API.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Rows:'
+  if results.get('rows', []):
+    for row in results.get('rows'):
+      print '\t'.join(row)
+  else:
+    print 'No Rows Found'
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/analytics/hello_analytics_api_v3.py b/samples/analytics/hello_analytics_api_v3.py
new file mode 100755
index 0000000..271c213
--- /dev/null
+++ b/samples/analytics/hello_analytics_api_v3.py
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2012 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.
+
+"""Simple intro to using the Google Analytics API v3.
+
+This application demonstrates how to use the python client library to access
+Google Analytics data. The sample traverses the Management API to obtain the
+authorized user's first profile ID. Then the sample uses this ID to
+contstruct a Core Reporting API query to return the top 25 organic search
+terms.
+
+Before you begin, you must sigup for a new project in the Google APIs console:
+https://code.google.com/apis/console
+
+Then register the project to use OAuth2.0 for installed applications.
+
+Finally you will need to add the client id, client secret, and redirect URL
+into the client_secrets.json file that is in the same directory as this sample.
+
+Sample Usage:
+
+  $ python hello_analytics_api_v3.py
+
+Also you can also get help on all the command-line flags the program
+understands by running:
+
+  $ python hello_analytics_api_v3.py --help
+"""
+
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
+
+import sys
+import sample_utils
+
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+
+
+def main(argv):
+  sample_utils.process_flags(argv)
+
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
+
+  # Try to make a request to the API. Print the results or handle errors.
+  try:
+    first_profile_id = get_first_profile_id(service)
+    if not first_profile_id:
+      print 'Could not find a valid profile for this user.'
+    else:
+      results = get_top_keywords(service, first_profile_id)
+      print_results(results)
+
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
+  except HttpError, error:
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
+
+  except AccessTokenRefreshError:
+    # Handle Auth errors.
+    print ('The credentials have been revoked or expired, please re-run '
+           'the application to re-authorize')
+
+
+def get_first_profile_id(service):
+  """Traverses Management API to return the first profile id.
+
+  This first queries the Accounts collection to get the first account ID.
+  This ID is used to query the Webproperties collection to retrieve the first
+  webproperty ID. And both account and webproperty IDs are used to query the
+  Profile collection to get the first profile id.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+
+  Returns:
+    A string with the first profile ID. None if a user does not have any
+    accounts, webproperties, or profiles.
+  """
+
+  accounts = service.management().accounts().list().execute()
+
+  if accounts.get('items'):
+    firstAccountId = accounts.get('items')[0].get('id')
+    webproperties = service.management().webproperties().list(
+        accountId=firstAccountId).execute()
+
+    if webproperties.get('items'):
+      firstWebpropertyId = webproperties.get('items')[0].get('id')
+      profiles = service.management().profiles().list(
+          accountId=firstAccountId,
+          webPropertyId=firstWebpropertyId).execute()
+
+      if profiles.get('items'):
+        return profiles.get('items')[0].get('id')
+
+  return None
+
+
+def get_top_keywords(service, profile_id):
+  """Executes and returns data from the Core Reporting API.
+
+  This queries the API for the top 25 organic search terms by visits.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+    profile_id: String The profile ID from which to retrieve analytics data.
+
+  Returns:
+    The response returned from the Core Reporting API.
+  """
+
+  return service.data().ga().get(
+      ids='ga:' + profile_id,
+      start_date='2012-01-01',
+      end_date='2012-01-15',
+      metrics='ga:visits',
+      dimensions='ga:source,ga:keyword',
+      sort='-ga:visits',
+      filters='ga:medium==organic',
+      start_index='1',
+      max_results='25').execute()
+
+
+def print_results(results):
+  """Prints out the results.
+
+  This prints out the profile name, the column headers, and all the rows of
+  data.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print
+  print 'Profile Name: %s' % results.get('profileInfo').get('profileName')
+  print
+
+  # Print header.
+  output = []
+  for header in results.get('columnHeaders'):
+    output.append('%30s' % header.get('name'))
+  print ''.join(output)
+
+  # Print data table.
+  if results.get('rows', []):
+    for row in results.get('rows'):
+      output = []
+      for cell in row:
+        output.append('%30s' % cell)
+      print ''.join(output)
+
+  else:
+    print 'No Rows Found'
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/analytics/management_v3_reference.py b/samples/analytics/management_v3_reference.py
old mode 100644
new mode 100755
index 0ecfc08..2d73445
--- a/samples/analytics/management_v3_reference.py
+++ b/samples/analytics/management_v3_reference.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 #
-# Copyright 2011 Google Inc. All Rights Reserved.
+# Copyright 2012 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.
@@ -32,79 +32,55 @@
 API Python Getting Started guide here:
 http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html
 
-Usage:
+Before You Begin:
 
-Before you begin, you should register your application as an installed
-application to get your own Project / OAUth2 Client ID / Secret:
-https://code.google.com/apis/console
+Update the client_secrets.json file
 
-Learn more about registering your Analytics Application here:
-http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html#authorize
+  You must update the clients_secrets.json file with a client id, client
+  secret, and the redirect uri. You get these values by creating a new project
+  in the Google APIs console and registering for OAuth2.0 for installed
+  applications: https://code.google.com/apis/console
 
-  $ python analytics.py
+  Learn more about registering your analytics application here:
+  http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html
+
+Sample Usage:
+
+  $ python management_v3_reference.py
 
 Also you can also get help on all the command-line flags the program
 understands by running:
 
-  $ python analytics.py --help
+  $ python management_v3_reference.py --help
 """
 
-__author__ = 'api.nickm@ (Nick Mihailovski)'
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
 
 import sys
+import sample_utils
 
-from apiclient.discovery import build
 from apiclient.errors import HttpError
-
-import gflags
-import httplib2
-
 from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import OAuth2WebServerFlow
-from oauth2client.file import Storage
-from oauth2client.tools import run
-
-FLAGS = gflags.FLAGS
-
-
-# Remember to get your own client_id / client_secret in the
-# Google API developer console: https://code.google.com/apis/console
-FLOW = OAuth2WebServerFlow(
-    client_id='INSERT_YOUR_CLIENT_ID_HERE',
-    client_secret='INSERT_YOUR_CLIENT_SECRET_HERE',
-    scope='https://www.googleapis.com/auth/analytics.readonly',
-    user_agent='analytics-api-v3-awesomeness')
-
-TOKEN_FILE_NAME = 'analytics.dat'
 
 
 def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
+  sample_utils.process_flags(argv)
 
-  # Manage re-using tokens.
-  storage = Storage(TOKEN_FILE_NAME)
-  credentials = storage.get()
-  if not credentials or credentials.invalid:
-    # Get a new token.
-    credentials = run(FLOW, storage)
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
 
-  # Build an authorized service object.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-  service = build('analytics', 'v3', http=http)
-
-  # Traverse the Management hiearchy and print results.
+  # Traverse the Management hiearchy and print results or handle errors.
   try:
     traverse_hiearchy(service)
 
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
   except HttpError, error:
-    print ('Arg, there was an API error : %s %s : %s' %
-            (error.resp.status, error.resp.reason, error._get_reason()))
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
 
   except AccessTokenRefreshError:
     print ('The credentials have been revoked or expired, please re-run'
@@ -126,18 +102,16 @@
     HttpError: If an error occured when accessing the API.
     AccessTokenRefreshError: If the current token was invalid.
   """
-  view = View()
 
   accounts = service.management().accounts().list().execute()
-
-  view.print_accounts(accounts)
+  print_accounts(accounts)
 
   if accounts.get('items'):
     firstAccountId = accounts.get('items')[0].get('id')
     webproperties = service.management().webproperties().list(
         accountId=firstAccountId).execute()
 
-    view.print_webproperties(webproperties)
+    print_webproperties(webproperties)
 
     if webproperties.get('items'):
       firstWebpropertyId = webproperties.get('items')[0].get('id')
@@ -145,7 +119,7 @@
           accountId=firstAccountId,
           webPropertyId=firstWebpropertyId).execute()
 
-      view.print_profiles(profiles)
+      print_profiles(profiles)
 
       if profiles.get('items'):
         firstProfileId = profiles.get('items')[0].get('id')
@@ -154,226 +128,285 @@
             webPropertyId=firstWebpropertyId,
             profileId=firstProfileId).execute()
 
-        view.print_goals(goals)
+        print_goals(goals)
 
-  view.print_segments(service.management().segments().list().execute())
+  print_segments(service.management().segments().list().execute())
 
 
-class View(object):
-  """Utility class to print various Management API collections."""
+def print_accounts(accounts_response):
+  """Prints all the account info in the Accounts Collection.
 
-  def print_accounts(self, accounts_list):
-    """Prints all the account info in the Accounts Collection."""
+  Args:
+    accounts_response: The response object returned from querying the Accounts
+        collection.
+  """
 
-    print '------ Account Collection -------'
-    self.print_pagination_info(accounts_list)
+  print '------ Account Collection -------'
+  print_pagination_info(accounts_response)
+  print
+
+  for account in accounts_response.get('items', []):
+    print 'Account ID      = %s' % account.get('id')
+    print 'Kind            = %s' % account.get('kind')
+    print 'Self Link       = %s' % account.get('selfLink')
+    print 'Account Name    = %s' % account.get('name')
+    print 'Created         = %s' % account.get('created')
+    print 'Updated         = %s' % account.get('updated')
+
+    child_link = account.get('childLink')
+    print 'Child link href = %s' % child_link.get('href')
+    print 'Child link type = %s' % child_link.get('type')
+    print
+  else:
+    print 'No accounts found.\n'
+
+
+def print_webproperties(webproperties_response):
+  """Prints all the web property info in the WebProperties collection.
+
+  Args:
+    webproperties_response: The response object returned from querying the
+        Webproperties collection.
+  """
+
+  print '------ Web Properties Collection -------'
+  print_pagination_info(webproperties_response)
+  print
+
+  for webproperty in webproperties_response.get('items', []):
+    print 'Kind               = %s' % webproperty.get('kind')
+    print 'Account ID         = %s' % webproperty.get('accountId')
+    print 'Web Property ID    = %s' % webproperty.get('id')
+    print ('Internal Web Property ID = %s' %
+           webproperty.get('internalWebPropertyId'))
+
+    print 'Website URL        = %s' % webproperty.get('websiteUrl')
+    print 'Created            = %s' % webproperty.get('created')
+    print 'Updated            = %s' % webproperty.get('updated')
+
+    print 'Self Link          = %s' % webproperty.get('selfLink')
+    parent_link = webproperty.get('parentLink')
+    print 'Parent link href   = %s' % parent_link.get('href')
+    print 'Parent link type   = %s' % parent_link.get('type')
+    child_link = webproperty.get('childLink')
+    print 'Child link href    = %s' % child_link.get('href')
+    print 'Child link type    = %s' % child_link.get('type')
+    print
+  else:
+    print 'No webproperties found.\n'
+
+
+def print_profiles(profiles_response):
+  """Prints all the profile info in the Profiles Collection.
+
+  Args:
+    profiles_response: The response object returned from querying the
+        Profiles collection.
+  """
+
+  print '------ Profiles Collection -------'
+  print_pagination_info(profiles_response)
+  print
+
+  for profile in profiles_response.get('items', []):
+    print 'Kind                      = %s' % profile.get('kind')
+    print 'Account ID                = %s' % profile.get('accountId')
+    print 'Web Property ID           = %s' % profile.get('webPropertyId')
+    print ('Internal Web Property ID = %s' %
+           profile.get('internalWebPropertyId'))
+    print 'Profile ID                = %s' % profile.get('id')
+    print 'Profile Name              = %s' % profile.get('name')
+
+    print 'Currency         = %s' % profile.get('currency')
+    print 'Timezone         = %s' % profile.get('timezone')
+    print 'Default Page     = %s' % profile.get('defaultPage')
+
+    print ('Exclude Query Parameters        = %s' %
+           profile.get('excludeQueryParameters'))
+    print ('Site Search Category Parameters = %s' %
+           profile.get('siteSearchCategoryParameters'))
+    print ('Site Search Query Parameters    = %s' %
+           profile.get('siteSearchQueryParameters'))
+
+    print 'Created          = %s' % profile.get('created')
+    print 'Updated          = %s' % profile.get('updated')
+
+    print 'Self Link        = %s' % profile.get('selfLink')
+    parent_link = profile.get('parentLink')
+    print 'Parent link href = %s' % parent_link.get('href')
+    print 'Parent link type = %s' % parent_link.get('type')
+    child_link = profile.get('childLink')
+    print 'Child link href  = %s' % child_link.get('href')
+    print 'Child link type  = %s' % child_link.get('type')
+    print
+  else:
+    print 'No profiles found.\n'
+
+
+def print_goals(goals_response):
+  """Prints all the goal info in the Goals collection.
+
+  Args:
+    goals_response: The response object returned from querying the Goals
+        collection
+  """
+
+  print '------ Goals Collection -------'
+  print_pagination_info(goals_response)
+  print
+
+  for goal in goals_response.get('items', []):
+    print 'Goal ID     = %s' % goal.get('id')
+    print 'Kind        = %s' % goal.get('kind')
+    print 'Self Link        = %s' % goal.get('selfLink')
+
+    print 'Account ID               = %s' % goal.get('accountId')
+    print 'Web Property ID          = %s' % goal.get('webPropertyId')
+    print ('Internal Web Property ID = %s' %
+           goal.get('internalWebPropertyId'))
+    print 'Profile ID               = %s' % goal.get('profileId')
+
+    print 'Goal Name   = %s' % goal.get('name')
+    print 'Goal Value  = %s' % goal.get('value')
+    print 'Goal Active = %s' % goal.get('active')
+    print 'Goal Type   = %s' % goal.get('type')
+
+    print 'Created     = %s' % goal.get('created')
+    print 'Updated     = %s' % goal.get('updated')
+
+    parent_link = goal.get('parentLink')
+    print 'Parent link href = %s' % parent_link.get('href')
+    print 'Parent link type = %s' % parent_link.get('type')
+
+    # Print the goal details depending on the type of goal.
+    if goal.get('urlDestinationDetails'):
+      print_url_destination_goal_details(
+          goal.get('urlDestinationDetails'))
+
+    elif goal.get('visitTimeOnSiteDetails'):
+      print_visit_time_on_site_goal_details(
+          goal.get('visitTimeOnSiteDetails'))
+
+    elif goal.get('visitNumPagesDetails'):
+      print_visit_num_pages_goal_details(
+          goal.get('visitNumPagesDetails'))
+
+    elif goal.get('eventDetails'):
+      print_event_goal_details(goal.get('eventDetails'))
+
+    print
+  else:
+    print 'No goals found.\n'
+
+
+def print_url_destination_goal_details(goal_details):
+  """Prints all the URL Destination goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Url Destination Goal -------'
+  print 'Goal URL            = %s' % goal_details.get('url')
+  print 'Case Sensitive      = %s' % goal_details.get('caseSensitive')
+  print 'Match Type          = %s' % goal_details.get('matchType')
+  print 'First Step Required = %s' % goal_details.get('firstStepRequired')
+
+  print '------ Url Destination Goal Steps -------'
+  for goal_step in goal_details.get('steps', []):
+    print 'Step Number  = %s' % goal_step.get('number')
+    print 'Step Name    = %s' % goal_step.get('name')
+    print 'Step URL     = %s' % goal_step.get('url')
+  else:
+    print 'No Steps Configured'
+
+
+def print_visit_time_on_site_goal_details(goal_details):
+  """Prints all the Visit Time On Site goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Visit Time On Site Goal -------'
+  print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+  print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+
+def print_visit_num_pages_goal_details(goal_details):
+  """Prints all the Visit Num Pages goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Visit Num Pages Goal -------'
+  print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+  print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+
+def print_event_goal_details(goal_details):
+  """Prints all the Event goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Event Goal -------'
+  print 'Use Event Value  = %s' % goal_details.get('useEventValue')
+
+  for event_condition in goal_details.get('eventConditions', []):
+    event_type = event_condition.get('type')
+    print 'Type             = %s' % event_type
+
+    if event_type in ('CATEGORY', 'ACTION', 'LABEL'):
+      print 'Match Type       = %s' % event_condition.get('matchType')
+      print 'Expression       = %s' % event_condition.get('expression')
+    else:  # VALUE type.
+      print 'Comparison Type  = %s' % event_condition.get('comparisonType')
+      print 'Comparison Value = %s' % event_condition.get('comparisonValue')
+
+
+def print_segments(segments_response):
+  """Prints all the segment info in the Segments collection.
+
+  Args:
+    segments_response: The response object returned from querying the
+        Segments collection.
+  """
+
+  print '------ Segments Collection -------'
+  print_pagination_info(segments_response)
+  print
+
+  for segment in segments_response.get('items', []):
+    print 'Segment ID = %s' % segment.get('id')
+    print 'Kind       = %s' % segment.get('kind')
+    print 'Self Link  = %s' % segment.get('selfLink')
+    print 'Name       = %s' % segment.get('name')
+    print 'Definition = %s' % segment.get('definition')
+    print 'Created    = %s' % segment.get('created')
+    print 'Updated    = %s' % segment.get('updated')
     print
 
-    for account in accounts_list.get('items'):
-      print 'Account ID      = %s' % account.get('id')
-      print 'Kind            = %s' % account.get('kind')
-      print 'Self Link       = %s' % account.get('selfLink')
-      print 'Account Name    = %s' % account.get('name')
-      print 'Created         = %s' % account.get('created')
-      print 'Updated         = %s' % account.get('updated')
 
-      child_link = account.get('childLink')
-      print 'Child link href = %s' % child_link.get('href')
-      print 'Child link type = %s' % child_link.get('type')
-      print
+def print_pagination_info(management_response):
+  """Prints common pagination details.
 
-  def print_webproperties(self, webproperties_list):
-    """Prints all the web property info in the WebProperties Collection."""
+  Args:
+    management_response: The common reponse object for each collection in the
+        Management API.
+  """
 
-    print '------ Web Properties Collection -------'
-    self.print_pagination_info(webproperties_list)
-    print
+  print 'Items per page = %s' % management_response.get('itemsPerPage')
+  print 'Total Results  = %s' % management_response.get('totalResults')
+  print 'Start Index    = %s' % management_response.get('startIndex')
 
-    for webproperty in webproperties_list.get('items'):
-      print 'Kind               = %s' % webproperty.get('kind')
-      print 'Account ID         = %s' % webproperty.get('accountId')
-      print 'Web Property ID    = %s' % webproperty.get('id')
-      print ('Internal Web Property ID = %s' %
-             webproperty.get('internalWebPropertyId'))
-
-      print 'Website URL        = %s' % webproperty.get('websiteUrl')
-      print 'Created            = %s' % webproperty.get('created')
-      print 'Updated            = %s' % webproperty.get('updated')
-
-      print 'Self Link          = %s' % webproperty.get('selfLink')
-      parent_link = webproperty.get('parentLink')
-      print 'Parent link href   = %s' % parent_link.get('href')
-      print 'Parent link type   = %s' % parent_link.get('type')
-      child_link = webproperty.get('childLink')
-      print 'Child link href    = %s' % child_link.get('href')
-      print 'Child link type    = %s' % child_link.get('type')
-      print
-
-  def print_profiles(self, profiles_list):
-    """Prints all the profile info in the Profiles Collection."""
-
-    print '------ Profiles Collection -------'
-    self.print_pagination_info(profiles_list)
-    print
-
-    for profile in profiles_list.get('items'):
-      print 'Kind                      = %s' % profile.get('kind')
-      print 'Account ID                = %s' % profile.get('accountId')
-      print 'Web Property ID           = %s' % profile.get('webPropertyId')
-      print ('Internal Web Property ID = %s' %
-             profile.get('internalWebPropertyId'))
-      print 'Profile ID                = %s' % profile.get('id')
-      print 'Profile Name              = %s' % profile.get('name')
-
-      print 'Currency         = %s' % profile.get('currency')
-      print 'Timezone         = %s' % profile.get('timezone')
-      print 'Default Page     = %s' % profile.get('defaultPage')
-
-      print ('Exclude Query Parameters        = %s' %
-             profile.get('excludeQueryParameters'))
-      print ('Site Search Category Parameters = %s' %
-             profile.get('siteSearchCategoryParameters'))
-      print ('Site Search Query Parameters    = %s' %
-             profile.get('siteSearchQueryParameters'))
-
-      print 'Created          = %s' % profile.get('created')
-      print 'Updated          = %s' % profile.get('updated')
-
-      print 'Self Link        = %s' % profile.get('selfLink')
-      parent_link = profile.get('parentLink')
-      print 'Parent link href = %s' % parent_link.get('href')
-      print 'Parent link type = %s' % parent_link.get('type')
-      child_link = profile.get('childLink')
-      print 'Child link href  = %s' % child_link.get('href')
-      print 'Child link type  = %s' % child_link.get('type')
-      print
-
-  def print_goals(self, goals_list):
-    """Prints all the goal info in the Goals Collection."""
-
-    print '------ Goals Collection -------'
-    self.print_pagination_info(goals_list)
-    print
-
-    for goal in goals_list.get('items'):
-      print 'Goal ID     = %s' % goal.get('id')
-      print 'Kind        = %s' % goal.get('kind')
-      print 'Self Link        = %s' % goal.get('selfLink')
-
-      print 'Account ID               = %s' % goal.get('accountId')
-      print 'Web Property ID          = %s' % goal.get('webPropertyId')
-      print ('Internal Web Property ID = %s' %
-             goal.get('internalWebPropertyId'))
-      print 'Profile ID               = %s' % goal.get('profileId')
-
-      print 'Goal Name   = %s' % goal.get('name')
-      print 'Goal Value  = %s' % goal.get('value')
-      print 'Goal Active = %s' % goal.get('active')
-      print 'Goal Type   = %s' % goal.get('type')
-
-      print 'Created     = %s' % goal.get('created')
-      print 'Updated     = %s' % goal.get('updated')
-
-      parent_link = goal.get('parentLink')
-      print 'Parent link href = %s' % parent_link.get('href')
-      print 'Parent link type = %s' % parent_link.get('type')
-
-      # Print the goal details depending on the type of goal.
-      if goal.get('urlDestinationDetails'):
-        self.print_url_destination_goal_details(
-            goal.get('urlDestinationDetails'))
-
-      elif goal.get('visitTimeOnSiteDetails'):
-        self.print_visit_time_on_site_goal_details(
-            goal.get('visitTimeOnSiteDetails'))
-
-      elif goal.get('visitNumPagesDetails'):
-        self.print_visit_num_pages_goal_details(
-            goal.get('visitNumPagesDetails'))
-
-      elif goal.get('eventDetails'):
-        self.print_event_goal_details(goal.get('eventDetails'))
-
-      print
-
-  def print_url_destination_goal_details(self, goal_details):
-    """Prints all the URL Destination goal type info."""
-
-    print '------ Url Destination Goal -------'
-    print 'Goal URL            = %s' % goal_details.get('url')
-    print 'Case Sensitive      = %s' % goal_details.get('caseSensitive')
-    print 'Match Type          = %s' % goal_details.get('matchType')
-    print 'First Step Required = %s' % goal_details.get('firstStepRequired')
-
-    print '------ Url Destination Goal Steps -------'
-    if goal_details.get('steps'):
-      for goal_step in goal_details.get('steps'):
-        print 'Step Number  = %s' % goal_step.get('number')
-        print 'Step Name    = %s' % goal_step.get('name')
-        print 'Step URL     = %s' % goal_step.get('url')
-    else:
-      print 'No Steps Configured'
-
-  def print_visit_time_on_site_goal_details(self, goal_details):
-    """Prints all the Visit Time On Site goal type info."""
-
-    print '------ Visit Time On Site Goal -------'
-    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
-    print 'comparison Value = %s' % goal_details.get('comparisonValue')
-
-  def print_visit_num_pages_goal_details(self, goal_details):
-    """Prints all the Visit Num Pages goal type info."""
-
-    print '------ Visit Num Pages Goal -------'
-    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
-    print 'comparison Value = %s' % goal_details.get('comparisonValue')
-
-  def print_event_goal_details(self, goal_details):
-    """Prints all the Event goal type info."""
-
-    print '------ Event Goal -------'
-    print 'Use Event Value  = %s' % goal_details.get('useEventValue')
-
-    for event_condition in goal_details.get('eventConditions'):
-      event_type = event_condition.get('type')
-      print 'Type             = %s' % event_type
-
-      if event_type in ('CATEGORY', 'ACTION', 'LABEL'):
-        print 'Match Type       = %s' % event_condition.get('matchType')
-        print 'Expression       = %s' % event_condition.get('expression')
-      else:  # VALUE type.
-        print 'Comparison Type  = %s' % event_condition.get('comparisonType')
-        print 'Comparison Value = %s' % event_condition.get('comparisonValue')
-
-  def print_segments(self, segments_list):
-    """Prints all the segment info in the Segments Collection."""
-
-    print '------ Segments Collection -------'
-    self.print_pagination_info(segments_list)
-    print
-
-    for segment in segments_list.get('items'):
-      print 'Segment ID = %s' % segment.get('id')
-      print 'Kind       = %s' % segment.get('kind')
-      print 'Self Link  = %s' % segment.get('selfLink')
-      print 'Name       = %s' % segment.get('name')
-      print 'Definition = %s' % segment.get('definition')
-      print 'Created    = %s' % segment.get('created')
-      print 'Updated    = %s' % segment.get('updated')
-      print
-
-  def print_pagination_info(self, mgmt_list):
-    """Prints common pagination details."""
-
-    print 'Items per page = %s' % mgmt_list.get('itemsPerPage')
-    print 'Total Results  = %s' % mgmt_list.get('totalResults')
-    print 'Start Index    = %s' % mgmt_list.get('startIndex')
-
-    # These only have values if other result pages exist.
-    if mgmt_list.get('previousLink'):
-      print 'Previous Link  = %s' % mgmt_list.get('previousLink')
-    if mgmt_list.get('nextLink'):
-      print 'Next Link      = %s' % mgmt_list.get('nextLink')
+  # These only have values if other result pages exist.
+  if management_response.get('previousLink'):
+    print 'Previous Link  = %s' % management_response.get('previousLink')
+  if management_response.get('nextLink'):
+    print 'Next Link      = %s' % management_response.get('nextLink')
 
 
 if __name__ == '__main__':
diff --git a/samples/analytics/sample_utils.py b/samples/analytics/sample_utils.py
new file mode 100644
index 0000000..c397bf8
--- /dev/null
+++ b/samples/analytics/sample_utils.py
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+#
+# Copyright 2012 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.
+
+"""Utilities for Analytics API code samples.
+
+Handles various tasks to do with logging, authentication and initialization.
+Mostly taken from Sergio :)
+
+Before You Begin:
+
+You must update the client_secrets.json file with a client id, client secret,
+and the redirect uri. You get these values by creating a new project
+in the Google APIs console and registering for OAuth2.0 for installed
+applications: https://code.google.com/apis/console
+
+Also all OAuth2.0 tokens are stored for resue in the file specified
+as TOKEN_FILE_NAME. You can modify this file name if you wish.
+"""
+
+__author__ = ('sergio.gomes@google.com (Sergio Gomes)'
+              'api.nickm@gmail.com (Nick Mihailovski)')
+
+import logging
+import os
+import sys
+from apiclient.discovery import build
+import gflags
+import httplib2
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.file import Storage
+from oauth2client.tools import run
+
+
+FLAGS = gflags.FLAGS
+
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret. You get these values by
+# creating a new project in the Google APIs console and registering for
+# OAuth2.0 for installed applications: <https://code.google.com/apis/console>
+CLIENT_SECRETS = 'client_secrets.json'
+
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
+    scope='https://www.googleapis.com/auth/analytics.readonly',
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
+
+# The gflags module makes defining command-line options easy for applications.
+# Run this program with the '--help' argument to see all the flags that it
+# understands.
+gflags.DEFINE_enum('logging_level', 'ERROR',
+                   ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+                   'Set the level of logging detail.')
+
+
+# Name of file that will store the access and refresh tokens to access
+# the API without having to login each time. Make sure this file is in
+# a secure place.
+TOKEN_FILE_NAME = 'analytics.dat'
+
+
+def process_flags(argv):
+  """Uses the command-line flags to set the logging level.
+
+  Args:
+    argv: List of command line arguments passed to the python script.
+  """
+
+  # Let the gflags module process the command-line arguments.
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  # Set the logging according to the command-line flag.
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
+
+def initialize_service():
+  """Returns an instance of service from discovery data and does auth.
+
+  This method tries to read any existing OAuth 2.0 credentials from the
+  Storage object. If the credentials do not exist, new credentials are
+  obtained. The crdentials are used to authorize an http object. The
+  http object is used to build the analytics service object.
+
+  Returns:
+    An analytics v3 service object.
+  """
+
+  # Create an httplib2.Http object to handle our HTTP requests.
+  http = httplib2.Http()
+
+  # Prepare credentials, and authorize HTTP object with them.
+  storage = Storage(TOKEN_FILE_NAME)
+  credentials = storage.get()
+  if credentials is None or credentials.invalid:
+    credentials = run(FLOW, storage)
+
+  http = credentials.authorize(http)
+
+  # Retrieve service.
+  return build('analytics', 'v3', http=http)