/*****************************************************
*  
*  Copyright 2009 Akamai Technologies, Inc.  All Rights Reserved.
*  
*****************************************************
*  The contents of this file are subject to the Mozilla Public License
*  Version 1.1 (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.mozilla.org/MPL/
*   
*  Software distributed under the License is distributed on an "AS IS"
*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
*  License for the specific language governing rights and limitations
*  under the License.
*   
*  
*  The Initial Developer of the Original Code is Akamai Technologies, Inc.
*  Portions created by Akamai Technologies, Inc. are Copyright (C) 2009 Akamai 
*  Technologies, Inc. All Rights Reserved. 
*  
*****************************************************/
package org.osmf.utils
{
	[ExcludeClass]
	
	/**
	 * @private
	 * 
	 * Class that contains static utility methods for manipulating and working
	 * with time values.
	 *  
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @productversion OSMF 1.0
	 */
	public class TimeUtil
	{
		/**
		 * Takes a time as a string and returns that time in seconds.
		 * <p>
		 * The following time values are supported:<ul>
		 * <li>full clock format in "hours:minutes:seconds" (for example 00:03:00).</li>
		 * <li>offset time (for example 10s or 2m).</li>
		 * </ul></p>
		 * Note: Offset times without units (for example 10) are assumed to be seconds.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static function parseTime(value:String):Number 
		{
			var time:Number = 0;
			var a:Array = value.split(":");
			
			if (a.length > 1) 
			{
				// Clock format, e.g. "hh:mm:ss"
				time = a[0] * 3600;
				time += a[1] * 60;
				time += Number(a[2]);
			}
			else 
			{
				// Offset time format, e.g. "1h", "8m", "10s"
				var mul:int = 0;
				
				switch (value.charAt(value.length-1)) 
				{
					case 'h':
						mul = 3600;
						break;
					case 'm':
						mul = 60;
						break;
					case 's':
						mul = 1;
						break;
				}
				
				if (mul) 
				{
					time = Number(value.substr(0, value.length-1)) * mul;
				}
				else 
				{
					time = Number(value);
				}
			}
			
			return time;
		}

		/**
		 * Takes time in seconds and returns a string in a time code
		 * format of hh:mm:ss.  If hours are not present, returns only
		 * mm:ss. For example, passing a value of <code>18750</code> will
		 * return <code>05:12:30</code>, but passing a value of <code>31</code>
		 * will return <code>00:31</code>. So in other words, minutes and seconds 
		 * will always be present.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static function formatAsTimeCode(sec:Number):String 
		{
			var h:Number = Math.floor(sec / 3600);
			h = isNaN(h) ? 0 : h;
			
			var m:Number = Math.floor((sec % 3600) / 60);
			m = isNaN(m) ? 0 : m;
			
			var s:Number = Math.floor((sec % 3600) % 60);
			s = isNaN(s) ? 0 : s;
			
			return (h == 0 ? "" : (h < 10 ? "0" + h.toString() + ":" : h.toString() + ":")) +
					(m < 10 ? "0" + m.toString() : m.toString()) + ":" + 
					(s < 10 ? "0" + s.toString() : s.toString());
		}
	}
}
