Demos = Class.create();
Demos.prototype = {
	controller: null,
	initialize: function(){
		this.initList();
		this.active = 0;
        this.oldActive = 0;
		this.demoBox = $('demo');
		this.listBox = $('demolist');
        this.allowClick = false;
	},
	initList: function(){
		new Ajax.Request('demos.json', { 
			method:'get' ,
			onSuccess: this.loadList.bind(this),
			onFailure: function() {
				window.status="Demo load failure";
				demoBox.innerHTML="Demo load failure";
			}
		});
	},
	loadList: function(transport){
		var json = transport.responseText.evalJSON();
		this.items = json.items;
		var hash = document.location.hash;
		var found = false;
		for (var i = 0; i < this.items.length; i++){
			if (hash == this.items[i].hash){
				this.active = i;
                this.oldActive = i;
				found = true;
			}
		}
		if (found == false)
			document.location.hash = this.items[this.active].hash;
		this.initRender();		
	},
	initRender: function(){
		var innerList = new Array();
		for (var i = 0; i < this.items.length; i++){
			var listItem = Builder.node('div', {'class':'listitem'},
				Builder.node('a', {'href' : this.items[i].hash, 'title' : this.items[i].title, 'id' : 'demo'+i}, 
				Builder.node('img', {'id': 'dimg'+i, 'src' : 'images/'+this.items[i].thumb, 'alt' : this.items[i].title}))
			);
			innerList.push(listItem);
		}
		this.listBox.appendChild(Builder.node('div', {'class':'innerlist', 'id':'innerlist'}, innerList));
		var targetWidth = 210 * this.items.length;
		this.innerlist = $('innerlist');
		var listItems = Element.childElements(this.innerlist);
		for (i = 0; i < this.items.length; i++){
			var thisDiv = Element.childElements(listItems[i]);
			thisDiv[0].observe('click', this.clickItem.bind(this));		
		}
		this.markActive();
		Element.setStyle(this.innerlist, {'width':targetWidth+'px'});
		if (targetWidth > 630){
			Element.setStyle(this.listBox, {'left':'0px'});
			Element.insert(this.listBox, {'before':Builder.node('div', {'class':'demobackward', 'id':'demobackward'}, 
				Builder.node('a', {'href':'javascript:LiveDemos.scrollBackward()'}, 
				Builder.node('img', {'src':'images/l.jpg', 'width':55, 'height':100, 'border':0, 'id':'backimage'})
			))});
			Element.insert(this.listBox, {'after':Builder.node('div', {'class':'demoforward', 'id':'demoforward'}, 
				Builder.node('a', {'href':'javascript:LiveDemos.scrollForward()'}, 
				Builder.node('img', {'src':'images/r.jpg', 'width':55, 'height':100, 'border':0, 'id':'forwardimage'})
			))});
			this.scrollable = true;
			Element.makePositioned(this.innerlist);
			var pos = Element.positionedOffset(this.innerlist);
			pos[0] = Math.max(pos[0] - (210 * this.active), (-210*this.items.length)+630);
			this.myMove = new Effect.Move(this.innerlist, {duration: 0.0, x: pos[0], y: pos[1], mode: 'absolute'});	
			setTimeout(this.disableMaxedArrows.bind(this), 25);		
		} else {
			var offset = Math.floor((630-targetWidth)/2)
			Element.setStyle(this.innerlist, {'padding-left':offset+'px'});
		}
        this.clearDemo();
	},
	clickItem: function(event){
        if(this.allowClick){
            var ele = Event.element(event).identify();
            this.active = ele.substring(4);
            if (this.active != this.oldActive){
                this.oldActive = this.active;
                this.markActive();
                this.setDemo();
                this.allowClick = false;
            }
        } else {
            // clicked too soon
            // alert('not yet');
        }
	},
	scrollBackward: function(){
		var pos = Element.positionedOffset(this.innerlist);
		if (this.scrollable && pos[0] < 0){
			pos[0] = pos[0] + 210;
			this.myMove = new Effect.Move(this.innerlist, {duration: 0.5, x: pos[0], y: pos[1], mode: 'absolute'});
			this.scrollable = false;
			setTimeout(this.setScrollable.bind(this), 510);
		}
	},
	scrollForward: function(){
		var pos = Element.positionedOffset(this.innerlist);
		if (this.scrollable && pos[0] > (-210*this.items.length)+630){
			pos[0] = pos[0] - 210;
			this.myMove = new Effect.Move(this.innerlist, {duration: 0.5, x: pos[0], y: pos[1], mode: 'absolute'});
			this.scrollable = false;
			setTimeout(this.setScrollable.bind(this), 510);
		}
	},
	setScrollable: function(){
		this.scrollable = true;
		this.disableMaxedArrows();
	},
	disableMaxedArrows: function(){
		var pos = Element.positionedOffset(this.innerlist);
		if (pos[0] >= 0){
			$('backimage').setOpacity(0.2);	
		} else {
			$('backimage').setOpacity(1.0);
		}
		if (pos[0] <= (-210*this.items.length)+630){
			$('forwardimage').setOpacity(0.2);	
		} else {
			$('forwardimage').setOpacity(1.0);	
		}
	
	},
	setDemo : function(){
		this.mainFade = Effect.Fade(this.demoBox, {duration: 0.5, to:0.1});
		setTimeout(this.clearDemo.bind(this), 510);
	},
	clearDemo : function(){
		while (this.demoBox.firstChild) {
			this.demoBox.removeChild(this.demoBox.firstChild);
		}
		// make new content for active demo
		var thisItem = this.items[this.active];
		var leftDiv=Builder.node('div', {'class':'demoleft'});
        var innerLeft = Builder.node('div', {'style':'padding:10px'});
        leftDiv.appendChild(innerLeft);
		var title=Builder.node('h2');
		title.innerHTML=thisItem.title;
		var desc=Builder.node('p');
		desc.innerHTML=thisItem.text;
		this.demoBox.appendChild(leftDiv);
		innerLeft.appendChild(title);
		innerLeft.appendChild(desc);
		if (thisItem.secondary.length > 0){
			for (var i = 0; i < thisItem.secondary.length; i++){
				// add a button for each secondary item
				var navDown = Builder.node('div', {'class':'nav-down'});
				var navLink = Builder.node('a', {'href':thisItem.secondary[i].url});
				var navLeft = Builder.node('div', {'class':'nav-left'});
				var navMain = Builder.node('div', {'class':'nav-main'});
				navMain.innerHTML = thisItem.secondary[i].label;
				var navRight = Builder.node('div', {'class':'nav-right'});
				navDown.appendChild(navLink);
				navLink.appendChild(navLeft);
				navLink.appendChild(navMain);
				navLink.appendChild(navRight);
				innerLeft.appendChild(navDown);
			}
		}
        if ($('demoright') != null) $('demoright').remove();
		var rightDiv=Builder.node('div', {'class':'demoright', 'id':'demoright'});
		this.demoBox.appendChild(rightDiv);
		if (thisItem.type == 'image'){
			var rightDiv=Builder.node('div', {'class':'demoright'});
			this.demoBox.appendChild(rightDiv);
			var img = Builder.node('img', {'src':thisItem.primary});
			rightDiv.appendChild(img);
		}
		this.mainFade = Effect.Fade(this.demoBox, {duration: 0.25, to:1.0});
		if (thisItem.type == 'u3d'){
			setTimeout(this.makeUnified.bind(this), 250);
		}
        setTimeout(this.waitClick.bind(this), 500);
	},
	makeUnified : function(){
        var thisItem = this.items[this.active];
        var rightDiv=Builder.node('div', {'class':'demoright'});
        if ($('demoright') != null) $('demoright').remove();
		var rightDiv=Builder.node('div', {'class':'demoright'});
        this.demoBox.appendChild(rightDiv);
        if (thisItem.type != 'u3d'){
            var img = Builder.node('img', {'src':thisItem.primary});
			rightDiv.appendChild(img);
        }
			if (this.DetectUnityWebPlayer()){
				// IE behaves poorly here, so we will just write directly to the innerHTML
                if (navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1){
                    rightDiv.innerHTML = "<object id=\"UnityObject\" width=\"620\" height=\"349\" classid=\"clsid:444785F1-DE89-4295-863A-D46C3A781394\"><param name=\"src\" value=\""+thisItem.primary+"\" /><embed id=\"UnityEmbed\" src=\""+thisItem.primary+"\" width=\"620\" height=\"349\" type=\"application/vnd.unity\" /></object>";
                } else {
                    var obj = Builder.node('object', {'id':'UnityObject', 'width':620, 'height':349, 'classid':'clsid:444785F1-DE89-4295-863A-D46C3A781394'});
                    var param = Builder.node('param', {'name':'src','value':thisItem.primary});
                    var embed = Builder.node('embed', {'id':'UnityEmbed', 'src':thisItem.primary, 'width':620, 'height':349, 'type':'application/vnd.unity'});
                    rightDiv.appendChild(obj);
                    obj.appendChild(param);
                    obj.appendChild(embed);
                }
			} else {
				var installerPath = this.GetInstallerPath();
				if (installerPath != ""){
					var unityPrompt = Builder.node('div', {'id':'UnityPrompt', 'align':'center'});
					var unityLink = Builder.node('a', {'href':installerPath});
					var unityImage = Builder.node('img', {'src':'http://webplayer.unity3d.com/installation/getunity.png', 'border':0});
					unityLink.appendChild(unityImage);
					unityPrompt.appendChild(unityLink);
					rightDiv.appendChild(unityPrompt);
					if (navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1)
						if (0)
						{
							var innerUnityPrompt = Builder.node('div', {'id':'InnerUnityPrompt'});
							var unityInstallerObject = Builder.node('object', {	'id' : 'UnityInstallerObject',
																				'classid' : 'clsid:444785F1-DE89-4295-863A-D46C3A781394',
																				'width' : 620,
																				'height' : 349,
																				'codebase' : 'http://webplayer.unity3d.com/download_webplayer-2.x/UnityWebPlayer.cab#version=2,0,0,0'
							});
							innerUnityPrompt.appendChild(unityInstallerObject);
							rightDiv.appendChild(innerUnityPrompt);
						}
						rightDiv.appendChild(Builder.node('iframe', {'name':'InstallerFrame', 'height':0, 'width':0, 'frameborder':0}));
				} else {
					var unityPrompt = Builder.node('div', {'id':'UnityPrompt', 'align':'center'});
					var unityLink = Builder.node('a', {'href':'javascript: window.open("http://www.unity3d.com/unity-web-player-2.x");'});
					var unityImage = Builder.node('img', {'src':'http://webplayer.unity3d.com/installation/getunity.png', 'border':0});
					unityLink.appendChild(unityImage);
					unityPrompt.appendChild(unityLink);
					rightDiv.appendChild(unityPrompt);
				}
				this.AutomaticReload();
			}
	
	
	},
    waitClick : function(){
        this.allowClick = true;
    },
	markActive : function(){
		var listItems = Element.childElements(this.innerlist);
		for (var i = 0; i < this.items.length; i++){
			if (i == this.active){
				listItems[i].childElements()[0].childElements()[0].setOpacity(0.5);
			} else {
				listItems[i].childElements()[0].childElements()[0].setOpacity(1.0);
			}	
		}
	},
	GetUnity : function () {
		if (navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1)
			return document.getElementById("UnityObject");
		else if (navigator.appVersion.toLowerCase().indexOf("safari") != -1)
			return document.getElementById("UnityObject");
		else
			return document.getElementById("UnityEmbed");
	},
	DetectUnityWebPlayer : function() {
		var tInstalled = false;
		if (navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.toLowerCase().indexOf("win") != -1) {
				tInstalled = DetectUnityWebPlayerActiveX();
		} else {
		if (navigator.mimeTypes && navigator.mimeTypes["application/vnd.unity"]) {
			if (navigator.mimeTypes["application/vnd.unity"].enabledPlugin && navigator.plugins && navigator.plugins["Unity Player"]) {
				tInstalled = true;	
			}
			}	
		}
		return tInstalled;	
	},
	GetInstallerPath : function () {
		var tDownloadURL = "";
			var hasXpi = navigator.userAgent.toLowerCase().indexOf( "firefox" ) != -1;
			
		// Use standalone installer
		if (1)
		{
			if (navigator.platform == "MacIntel")
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/webplayer-i386.dmg";
			else if (navigator.platform == "MacPPC")
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/webplayer-ppc.dmg";
			else if (navigator.platform.toLowerCase().indexOf("win") != -1)
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/UnityWebPlayer.exe";
			return tDownloadURL;
		}
		// Use XPI installer
		else
		{
			if (navigator.platform == "MacIntel")
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/UnityWebPlayerOSX.xpi";
			else if (navigator.platform == "MacPPC")
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/UnityWebPlayerOSX.xpi";
			else if (navigator.platform.toLowerCase().indexOf("win") != -1)
				tDownloadURL = "http://webplayer.unity3d.com/download_webplayer-2.x/UnityWebPlayerWin32.xpi";
			return tDownloadURL;
		}    			
	},
	AutomaticReload : function() {
		navigator.plugins.refresh();
		if (this.DetectUnityWebPlayer())
			window.location.reload();
		setTimeout(this.AutomaticReload.bind(this), 500);
	}
}

Event.observe(window, 'load', function() {
	window.LiveDemos = new Demos();
}, false);

