// vim: sw=4:ts=4:nu:nospell

/**
 * HyperCities Flash TimeSlider Control
 *
 * @author    Lung-Chih Tung
 * @copyright (c) 2009, by HyperCities Tech Team
 * @date      2009-01-05
 * @version   0.7
 *
 */

// create application namespace
HyperCities.timebar = function() {

	var _id = "[HyperCities.timebar] ";

	var _timeRangeRatio = 0.85;
	var _scaleFloor = -2000;	//lower bound
	var _scaleCeiling = 3000;	//upper bound
	var _low = 1700;	//default start time
	var _high = 2009;	//default end time
	var _startYear = null;	//
	var _endYear = null	//
	var _currentYear = null;	
	var _activeYear = null;
	var _rescaleDuration = 1500;

	//ActiveX specific functions
	var AC_AX_RunContent = function(){
	  var ret = AC_AX_GetArgs(arguments);
	  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	};

	var AC_AX_GetArgs = function(args){
	  var ret = new Object();
	  ret.embedAttrs = new Object();
	  ret.params = new Object();
	  ret.objAttrs = new Object();
	  for (var i=0; i < args.length; i=i+2){
	    var currArg = args[i].toLowerCase();

	    switch (currArg){
	      case "pluginspage":
	      case "type":
	      case "src":
	        ret.embedAttrs[args[i]] = args[i+1];
	        break;
	      case "data":
	      case "codebase":
	      case "classid":
	      case "id":
	      case "onafterupdate":
	      case "onbeforeupdate":
	      case "onblur":
	      case "oncellchange":
	      case "onclick":
	      case "ondblClick":
	      case "ondrag":
	      case "ondragend":
	      case "ondragenter":
	      case "ondragleave":
	      case "ondragover":
	      case "ondrop":
	      case "onfinish":
	      case "onfocus":
	      case "onhelp":
	      case "onmousedown":
	      case "onmouseup":
	      case "onmouseover":
	      case "onmousemove":
	      case "onmouseout":
	      case "onkeypress":
	      case "onkeydown":
	      case "onkeyup":
	      case "onload":
	      case "onlosecapture":
	      case "onpropertychange":
	      case "onreadystatechange":
	      case "onrowsdelete":
	      case "onrowenter":
	      case "onrowexit":
	      case "onrowsinserted":
	      case "onstart":
	      case "onscroll":
	      case "onbeforeeditfocus":
	      case "onactivate":
	      case "onbeforedeactivate":
	      case "ondeactivate":
	        ret.objAttrs[args[i]] = args[i+1];
	        break;
	      case "width":
	      case "height":
	      case "align":
	      case "vspace":
	      case "hspace":
	      case "class":
	      case "title":
	      case "accesskey":
	      case "name":
	      case "tabindex":
	        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
	        break;
	      default:
	        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
	        break;
	    }
	  }
	  return ret;
	};

	//other browsers' functions
	var AC_AddExtension = function(src, ext)
	{
	  if (src.indexOf('?') != -1)
	    return src.replace(/\?/, ext+'?');
	  else
	    return src + ext;
	};

	var AC_Generateobj = function(objAttrs, params, embedAttrs)
	{
	  var str = '<object ';
	  for (var i in objAttrs)
	    str += i + '="' + objAttrs[i] + '" ';
	  str += '>';
	  for (var i in params)
	    str += '<param name="' + i + '" value="' + params[i] + '" /> ';
	  str += '<embed ';
	  for (var i in embedAttrs)
	    str += i + '="' + embedAttrs[i] + '" ';
	  str += ' ></embed></object>';

		//document.write(str);
	  return str;
	};

	var AC_FL_RunContent = function(){
	  var ret =
	    AC_GetArgs
	    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
	     , "application/x-shockwave-flash"
	    );
	  return AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	};

	var AC_SW_RunContent = function(){
	  var ret =
	    AC_GetArgs
	    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
	     , null
	    );
	  return AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	};

	var AC_GetArgs = function(args, ext, srcParamName, classid, mimeType){
	  var ret = new Object();
	  ret.embedAttrs = new Object();
	  ret.params = new Object();
	  ret.objAttrs = new Object();
	  for (var i=0; i < args.length; i=i+2){
	    var currArg = args[i].toLowerCase();

	    switch (currArg){
	      case "classid":
	        break;
	      case "pluginspage":
	        ret.embedAttrs[args[i]] = args[i+1];
	        break;
	      case "src":
	      case "movie":
	        args[i+1] = AC_AddExtension(args[i+1], ext);
	        ret.embedAttrs["src"] = args[i+1];
	        ret.params[srcParamName] = args[i+1];
	        break;
	      case "onafterupdate":
	      case "onbeforeupdate":
	      case "onblur":
	      case "oncellchange":
	      case "onclick":
	      case "ondblClick":
	      case "ondrag":
	      case "ondragend":
	      case "ondragenter":
	      case "ondragleave":
	      case "ondragover":
	      case "ondrop":
	      case "onfinish":
	      case "onfocus":
	      case "onhelp":
	      case "onmousedown":
	      case "onmouseup":
	      case "onmouseover":
	      case "onmousemove":
	      case "onmouseout":
	      case "onkeypress":
	      case "onkeydown":
	      case "onkeyup":
	      case "onload":
	      case "onlosecapture":
	      case "onpropertychange":
	      case "onreadystatechange":
	      case "onrowsdelete":
	      case "onrowenter":
	      case "onrowexit":
	      case "onrowsinserted":
	      case "onstart":
	      case "onscroll":
	      case "onbeforeeditfocus":
	      case "onactivate":
	      case "onbeforedeactivate":
	      case "ondeactivate":
	      case "type":
	      case "codebase":
	        ret.objAttrs[args[i]] = args[i+1];
	        break;
	      case "width":
	      case "height":
	      case "align":
	      case "vspace":
	      case "wmode":
	      case "hspace":
	      case "class":
	      case "title":
	      case "accesskey":
	      case "name":
	      case "tabindex":
	      case "id":
	        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
	        break;
	      default:
	        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
	        break;
	    }
	  }
	  ret.objAttrs["classid"] = classid;
	  if (mimeType) ret.embedAttrs["type"] = mimeType;
	  return ret;
	};

	var _initTimebar = function($container) {
		var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);

		if (hasRightVersion)
		{
			// if we've detected an acceptable version
			var flash_width = '100%';
			var flash_height = '61px';
			var id = 'timeslider';
			var movie = 'files/timeslider';
			//var flashvars = 'low=1907&high=2009&current=1950&marker=1988';
			//var flashvars = 'timeRangeRatio=0.85&scaleFloor=-2000&scaleCeiling=2300&low=1700&high=2009';
			var flashvars = 'timeRangeRatio='+_timeRangeRatio+'&scaleFloor='+_scaleFloor+'&scaleCeiling='+_scaleCeiling+'&low='+_low+'&high='+_high;

			var timeslider;
			timeslider = AC_FL_RunContent('codebase', 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0',
					'width', flash_width, 'height', flash_height, 'wmode', 'transparent',
					'id', id, 'name', id,
					'movie', movie, 'src', movie,
					'flashvars', flashvars,
					'quality', 'high', 'scale', 'noscale', 'salign','tl',
					'pluginspage','http://www.macromedia.com/go/getflashplayer'
				); //end AC code
			
			// Generate Slider instance
			var timebarDiv = $(document.createElement("div"));
			timebarDiv.html(timeslider);
			$container.append(timebarDiv);

			return true;
		}
		else
		{
			return false;
		}
	};

	return {

		init: function($container) {
			
			var result = _initTimebar($container);

			var startTime = new Date();
			var endTime = new Date();
			startTime.setFullYear(1700);
			endTime.setFullYear(2009);
			HyperCities.mainMap.setTimespan(startTime, endTime);
			
			return result;
		},

		getTime: function() {
			return timebar_get();
		},

		/** set the timespan of time bar, only set years
		 *  @params $current: current year
		 *  @params $start: start year
		 *  @params $end: end year
		 *  @params $active: actvie year
		 */		
		setTime: function($current, $start, $end, $active, $updateMap) {
		
			HyperCities.debug(_id + "Set Timespan " + $start + " ~ " + $end);

			if (HyperCities.util.getObjectClass($current) === "Date")
				$current = $current.getFullYear();
			if (HyperCities.util.getObjectClass($start) === "Date")
				$start = $start.getFullYear();
			if (HyperCities.util.getObjectClass($end) === "Date")
				$end = $end.getFullYear();
			if (HyperCities.util.getObjectClass($active) === "Date")
				$active = $active.getFullYear();	
	
			if ($current === "undefined" || $current === null)
				$current = _currentYear;
			else
				_currentYear = $current;
			if ($start === "undefined" || $start === null)
				$start = _startYear;
			else
				_startYear = $start;
			if ($end === "undefined" || $end === null)
				$end = _endYear;
			else
				_endYear = $end;
			if ($active === "undefined" || $active === null)
				$active = _activeYear;
			else
				_activeYear = $active;

//			HyperCities.debug(_id + "Set timespan");
//			HyperCities.debug(_id + "Current time: "+$current);
//			HyperCities.debug(_id + "Start time: "+$start);
//			HyperCities.debug(_id + "End time: "+$end);
//			HyperCities.debug(_id + "Active time: "+$active);
				
			timebar_set($current, $start, $end, $active, _scaleFloor, _scaleCeiling, _rescaleDuration);
			
			//set map timespan before doing syncSession
			var startTime = new Date();
			var endTime = new Date();
			startTime.setFullYear($start);
			endTime.setFullYear($end);
			HyperCities.mainMap.setTimespan(startTime, endTime);

			if ( $updateMap === true ) {
				HyperCities.syncSession();
			} 

		},

		highlightPeriod: function($id, $start, $end, $color, $opacity) {
			//HyperCities.debug(_id + "Highlight Timespan " + $start + "-" + $end);

			highlightPeriod({id: $id,
					start: $start, end: $end,
					style: {color: $color, alpha: $opacity}
					});
		},

		clearPeriodHighlight: function($id) {
			clearPeriodHighlight($id);
		},

		//this function should only be called by timebar component
		timeChangeHandler: function($current, $start, $end) {

			var startTime = new Date();
			var endTime = new Date();
			var currentTime = new Date();
		
			//new timebar passes in millisec
			if (String($current).length > 4)
			{
				startTime.setTime($start);
				endTime.setTime($end);
				currentTime.setTime($current);
			}
			else
			{
				//old timebar passes in 4 digit numbers of year
				startTime.setFullYear($start);
				endTime.setFullYear($end);
				currentTime.setFullYear($current);
			}
	
			HyperCities.debug("_currentYear="+_currentYear);
			HyperCities.debug("currentTime.getFullYear()="+currentTime.getFullYear());

			if (_currentYear !== null && _currentYear !== currentTime.getFullYear())
			{
				//user moves the current year handle
				HyperCities.debug(_id + "Current time changed to " + currentTime.toString("yyyy-MM-dd HH:mm:ss"));
				_currentYear = currentTime.getFullYear();
			
				var mapId = HyperCities.mapList.findMap(_currentYear);

				//if a map is found and it is not clicked
				if (mapId !== null && !$("#intelliList #intelliItem_"+mapId).hasClass("highlight"))
					$("#intelliList #intelliItem_"+mapId).click();
			}
			else
			{
				//user moves the timespan handle
				HyperCities.debug(_id + "Timespan changed to " + startTime.toString("yyyy-MM-dd HH:mm:ss") + " ~ " + endTime.toString("yyyy-MM-dd HH:mm:ss"));
				
				_startYear = startTime.getFullYear();
				_endYear = endTime.getFullYear();
				
				HyperCities.timebar.setTime(null, null, null, null, true);
			}
		}
	};
}(); // end of Object
