var Silverlight = {

	startup: function(sender, args) {
		var video = sender.findName("video");
			video.Source = sender.getHost().InitParams;
		Silverlight.resize(sender, args);
	},
	media_opened: function(sender, args) {
		Silverlight.start(sender, args);
		var video = sender.findName("video");
		var content = sender.getHost().content;
		new Request({
			url: sender.getHost().InitParams.replace('wvx','smi?_time='+$time()),
			onSuccess: function(text) {
				var body = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i)[1];
				var syncregexp = /<sync start="?(\d+)"?>([\s\S]*?)<\/sync>/ig;
				var textregexp = /<p[^>]*>([\s\S]*?)(?:<\/?p|$)/i;
				var match, marker;
				while (match = syncregexp.exec(body)) {
					marker = content.createFromXaml("<TimelineMarker/>");
					marker.Type = "CC";
					marker.Text = match[2].match(textregexp)[1].replace("&nbsp;"," ").replace(/<br\/?>/ig,"\n");
					marker.Time = "00:00:"+(+match[1]/1000);
					video.Markers.add(marker);
				}
			}
		}).get();
	},
	start: function(sender, args) {
		//sender.findName("video").play();
		sender.findName("button").Visibility = "Collapsed";
		sender.findName("overlay").Visibility = "Visible";
	},
	play_pause: function(sender, args) {
		var video = sender.findName("video");
			video[video.CurrentState == 'Playing' ? 'Pause' : 'Play']();
	},
	stop: function(sender, args) {
		var video = sender.findName("video");
			video.Stop();
			//video.Position = "00:00:00";
	},
	state_changed: function(sender, args) {
		var state = sender.findName("video").CurrentState;
		sender.findName("play").opacity = state == 'Playing' ? 0 : 1;
		sender.findName("pause").opacity = state == 'Playing' ? 1 : 0;
		if (state == 'Playing') {
			Silverlight.ticker = window.setInterval(Silverlight.position.pass([sender, args]), 100);
			Silverlight.position(sender, args);
		} else if (Silverlight.ticker) {
			window.clearInterval(Silverlight.ticker);
		}
		if (state == 'Stopped') {
			sender.findName("position").Width = 0;
			sender.findName("mediaState").Text = "";
		}
		if (state == 'Opening') {
			sender.findName("buffer").Visibility = "Visible";
			sender.findName("bufferingState").Text = "     Opening";
		}
	},
	buffering: function(sender, args) {
		var video = sender.findName("video");
		sender.findName("buffer").Visibility = video.CurrentState == "Buffering" ? "Visible" : "Collapsed";
		sender.findName("bufferingState").Text = "Buffering " + Math.round(100*video.BufferingProgress) + "%";
	},
	formatTime: function(seconds) {
		return Math.floor(seconds / 60) + ":" + (seconds % 60 < 9.5 ? "0" : "") + Math.round(seconds % 60);
	},
	marker_reached: function(sender, args) {
		var video = sender.findName("video");
		var marker = args.Marker;
		if (marker.Type == "CC" && video.IsMuted) {
			sender.findName("captions").Opacity = marker.Text.trim() == "" ? 0 : 1;
			sender.findName("captionText").Text = marker.Text;
			sender.findName("overlay").RowDefinitions.GetItem(1).Height = "" + Math.round(sender.findName("captionText").ActualHeight + 4);
		}
	},
	position: function(sender, args) {
		try {
			var video = sender.findName("video");
			var position = video.Position.Seconds;
			var duration = video.NaturalDuration.Seconds;
			sender.findName("position").Width = sender.findName("duration").ActualWidth * position / duration;
			sender.findName("mediaState").Text = Silverlight.formatTime(position);
			sender.findName("durationText").Text = Silverlight.formatTime(duration);
		} catch(e) {
			window.clearInterval(Silverlight.ticker);
		}
	},
	seek: function(sender, args) {
		var video = sender.findName("video");
		if (video.CanSeek) {
			var duration = sender.findName("duration");
			video.Position = "0:"+Silverlight.formatTime(video.NaturalDuration.Seconds * args.GetPosition(duration).X / duration.ActualWidth);
			Silverlight.position(sender, args);
		}
	},
	toggle_mute: function(sender, args) {
		var video = sender.findName("video");
		video.IsMuted = !video.IsMuted;
		sender.findName("volume").Opacity = video.IsMuted ? 0 : 1;
		sender.findName("mute").Opacity = video.IsMuted ? 1 : 0;
	},
	toggle_fullscreen: function(sender, args) {
		var content = sender.getHost().content;
		content.fullScreen = !content.fullScreen;
		sender.findName("fullscreen").opacity = content.fullScreen ? 0 : 1;
		sender.findName("smallscreen").opacity = content.fullScreen ? 1 : 0;
		Silverlight.leave(sender, args);
		Silverlight[content.fullScreen ? 'enter' : 'leave'](sender.findName("overlay"), 'boop');
	},
	enter: function(sender, args) {
		sender.Cursor = "Arrow";
		var host = sender.getHost(), hover = sender;
		switch (sender.name) {
			case 'play_pause':
			case 'stop':
			case 'toggle_mute':
			case 'toggle_fullscreen': hover = sender.children.GetItem(0); break;
			case 'button': hover = sender.children.GetItem(1); break;
			case 'overlay': hover = sender.findName("controls"); break;
		}
		if (Silverlight.timer[sender.name]) window.clearInterval(Silverlight.timer[sender.name]);
		Silverlight.timer[sender.name] = window.setTimeout(function(){
			Silverlight.leave(sender, 'force');
		}, host.content.fullScreen ? 2000 : 999999);
		hover.opacity = 1;
	},
	leave: function(sender, args) {
		if (sender.name == 'overlay' && sender.getHost().content.fullScreen && args != 'force') return;
		sender.Cursor = "None";
		var hover = sender;
		switch (sender.name) {
			case 'play_pause':
			case 'stop':
			case 'toggle_mute':
			case 'toggle_fullscreen': hover = sender.children.GetItem(0); break;
			case 'button': hover = sender.children.GetItem(1); break;
			case 'overlay': hover = sender.findName("controls"); break;
		}
		if (Silverlight.timer[sender.name]) window.clearInterval(Silverlight.timer[sender.name]);
		var timer = Silverlight.timer[sender.name] = window.setInterval(function(){
			try {
				if (hover.opacity <= 0) return window.clearInterval(timer);
				hover.opacity = hover.opacity - 0.1;
			} catch(e) {
				window.clearInterval(timer);
			}
		}, 20);
	},
	timer: {},
	resize: function(sender, args) {
		var content = sender.getHost().content;
		if (content.ActualHeight == 0)
			return window.setTimeout(function(){ Silverlight.resize(sender, args); }, 10);
		var canvas = sender.findName("canvas");
			canvas.Width = content.ActualWidth;
			canvas.Height = content.ActualHeight;
		var video = sender.findName("video");
			video.Width = content.ActualWidth;
			video.Height = content.ActualHeight;
		var button = sender.findName("button");
			button['Canvas.Left'] = (content.ActualWidth - 100) / 2;
			button['Canvas.Top'] = (content.ActualHeight - 100) / 2;
		var zoom = content.fullScreen ? 2 : 1;
		var overlay = sender.findName("overlay");
			overlay.Width = content.ActualWidth / zoom;
			overlay.Height = content.ActualHeight / zoom;
			overlay.RenderTransform.ScaleX = zoom;
			overlay.RenderTransform.ScaleY = zoom;
			overlay.RowDefinitions.GetItem(2).Height = content.fullScreen ? '25' : '26';
		var controls = sender.findName("controls");
			controls.RowDefinitions.GetItem(2).Height = content.fullScreen ? '0' : '1';
			controls.ColumnDefinitions.GetItem(0).Width = content.fullScreen ? '0' : '1';
			controls.ColumnDefinitions.GetItem(10).Width = content.fullScreen ? '0' : '1';
		var buffer = sender.findName("buffer");
			buffer.Width = content.ActualWidth / zoom;
			buffer.Height = content.ActualHeight / zoom;
			buffer.RenderTransform.ScaleX = zoom;
			buffer.RenderTransform.ScaleY = zoom;
			buffer['Canvas.Left'] = (content.ActualWidth - 120 * zoom) / 2;
			buffer['Canvas.Top'] = (content.ActualHeight - 40 * zoom) / 2;
		if (video.Position.Seconds > 0)
			window.setTimeout(function(){ Silverlight.position(sender, args); }, 1);
	},
	on_error: function(sender, args) {
		console.log(args, args.getHost());
		var video = args.getHost().video;
			video.type = 'W';
			video.url = video.url.replace('xaml','asx');
			video.build();
		console.log(args.errorType, args.errorCode, args.errorMessage);
	}

};

var player_startup = Silverlight.startup;
var player_loaded = Silverlight.startup;
var media_opened = Silverlight.media_opened;
var media_start = Silverlight.start;
var media_play_pause = Silverlight.play_pause;
var media_stop = Silverlight.stop;
var media_state_changed = Silverlight.state_changed;
var buffering_progress_changed = Silverlight.buffering;
var marker_reached = Silverlight.marker_reached;
var enter = Silverlight.enter;
var leave = Silverlight.leave;
var seek = Silverlight.seek;
var on_error_event_handler = Silverlight.on_error;
var on_resize_event_handler = Silverlight.resize;
var toggle_mute = Silverlight.toggle_mute;
var toggle_fullscreen = Silverlight.toggle_fullscreen;
var full_screen_changed = Silverlight.resize;