// Preloader sgrauso

var preloadimages = new Array(
	"images/slideshow_next.gif",
	"images/slideshow_previous.gif",
	"images/window/top_left.gif",
	"images/window/top_center.gif",
	"images/window/top_right.gif",
	"images/window/center_right.gif",
	"images/window/center_left.gif",
	"images/window/bottom_left.gif",
	"images/window/bottom_center.gif",
	"images/window/bottom_right.gif",
	"images/window/sizer.gif",
	"images/window/close.gif",
	"images/window/minimize.gif",
	"images/window/maximize.gif"
);

preloadimages.each( function(preloadimage) {
	var tempimg = new Image();
	tempimg.src = preloadimage;
});

// Sniffo la versione del browser

var br=getBrowser();
var issafari = (br[0].toLowerCase() == "safari")?true:false;


Delegate = {
version: "1.0"
};
Delegate.create = function(obj, func, args){
var f = function(){
var target = arguments.callee.target;
var func = arguments.callee.func;
var args = arguments.callee.args;
return func.apply(target, (args.length < 1 ? arguments : args));
};
f.args = (args != undefined && args.length > 0 ? args : new Array());
f.target = obj;
f.func = func;
return f;
};

// Serializzatore di richieste Ajax
var AjaxSerializer = Class.create();
AjaxSerializer.prototype = {
		//Constructor
		initialize:function(_url) {
			this.url = _url;
			this.requests = new Array();
			this.loading = false;
		},
		
		//Method for queueing requests
		request:function(parameters) {
			if(!this.loading)
			{
				this.loading = true;
				this.startRequest(parameters);
			}
			else this.requests.push(parameters);
		},
		
		startRequest:function(parameters) {
			var thisobj = this;
			if(parameters.onComplete) 
			{
				var oldoncomplete = parameters.onComplete;
				parameters.onComplete = function(originalRequest, json){ thisobj.completedRequest(originalRequest); oldoncomplete(originalRequest,json); };
			}
			else parameters.onComplete = function(originalRequest) { thisobj.completedRequest(originalRequest); };
			new Ajax.Request(this.url, parameters);
		},
		
		completedRequest:function(originalRequest) {
			if(this.requests.length > 0)
			{
				var params = this.requests.pop();
				this.startRequest(params);
			}
			else this.loading = false;
		}
};

// SLIDESHOW CLASS

var SlideShow = Class.create();
SlideShow.prototype = {
	initialize:function(_paramsarray, _containerid, _interval, _options) {
			this.containerid = _containerid;
			this.container = $(_containerid);
			this.currimageindex = 0;
			this.interval = _interval;
			this.swapping = false;
			this.hidden = true;
			this.destroyed = false;
			this.tooltipcreated = false;
			this.observers = new Array();
			this.updateimageinterval = -1;
			this,shownimage = -1;
			this.parseParameters(_paramsarray);
			if(this.imagesnum > 0)
			{
				this.createHTML();
				//this.startImagesLoading();
				this.showImage(this);
				this.startSequentialImagesLoading();
			}
			else
			{
				this.container.innerHTML = "nessuna immagine disponibile";
			}
	},
	parseParameters:function(paramsarray) {
		this.imagedata = new Array();
		this.imagesnum = 0;
		for(var i=0;i < paramsarray.images.length;i++)
		{
			var tempimage = paramsarray.images[i];
			this.imagedata[this.imagesnum] = {
				image_url:tempimage.immagine.substr(3),
				thumb_url:tempimage.thumb.substr(3),
				id:tempimage.work_image_id,
				type:"image",
				title:tempimage.titolo,
				comment:tempimage.descrizione,
				loaded:false,
				error:false
			};
			this.imagesnum++;
		}
		for(var i=0;i < paramsarray.swf.length;i++)
		{
			var tempimage = paramsarray.swf[i];
			this.imagedata[this.imagesnum] = {
				thumb_url:tempimage.thumb.substr(3),
				id:tempimage.work_swf_id,
				type:"swf",
				swf_url:tempimage.swf.substr(3),
				swf_width:parseInt(tempimage.swf_width),
				swf_height:parseInt(tempimage.swf_height),
				title:tempimage.titolo,
				comment:tempimage.descrizione,
				loaded:false,
				error:false
			};
			this.imagesnum++;
		}
	},
	startSequentialImagesLoading:function() {
		this.loadImage(0, this);
	},
	loadImage:function(imageindex, me) {
		var showandchecknext = function() {
			if(imageindex == me.currimageindex) me.updateImage(me);
			var checkindex = 0;
			if(imageindex < (me.imagesnum-1)) checkindex = imageindex+1;
			var stopchecking = false;
			while(!stopchecking)
			{
				if(me.imagedata[checkindex].loaded == false)
				{
					/*
					var loadImageHelper = function() {
						me.loadImage(checkindex, me);
					};
					window.setTimeout(loadImageHelper, 500);
					*/
					me.loadImage(checkindex, me);
					stopchecking = true;
				}
				else if(checkindex < (me.imagesnum - 1)) checkindex++;
				else stopchecking = true;
			}
		};
		
		me.tempimage = new Image();
		me.tempimage.onload = function() {
			me.imagedata[imageindex].loaded = true;
			showandchecknext();
		};
		me.tempimage.onerror = function() {
			me.imagedata[imageindex].error = true;
			showandchecknext();
		};
		me.tempimage.onabort = function() {
			me.imagedata[imageindex].error = true;
			showandchecknext();
		};
				
		me.tempimage.src = me.imagedata[imageindex].thumb_url;	
	},
	startImagesLoading:function() {
		var me = this;
		this.imagedata.each( function(image, imageindex) {
			var prova = new Image();
			prova.onload = function() { 
				image.loaded = true; 
				if(imageindex == me.currimageindex) me.updateImage(me);
			};
			prova.src = image.thumb_url;
		});
	},
	createHTML:function() {
		var me = this;
		this.container.style.display = "none";
		this.containertableid = this.containerid + "_table";
		this.container.innerHTML = '<table align="center" class="slideshow_container" id="' + this.containertableid + '"><tr><td><div class="slideshow_image"><div class="slideshow_loading">loading...</div><div class="slideshow_unavailable">immagine non disponibile</div><img src="#" class="tooltipTrigger" id="' + this.containerid + '_image" /></div></td></tr><tr><td><table height="30"><tr><td align="left"><span class="slideshow_caption"></span></td><td align="right"><span class="slideshow_previous">&larr;</span><span class="slideshow_next">&rarr;</span></td></tr></table></td></tr></table>';
		//this.imageelement = new Image();
		//this.imageelement.className = "tooltipTrigger";
		//this.imageelement.id = this.containerid + "_image";
		this.imagecontainer = document.getElementsByClassName("slideshow_image", this.container)[0];
		this.imageelement = document.getElementsByClassName("tooltipTrigger", this.imagecontainer)[0];
		this.imageelement.onclick = function() { me.imageClicked(me) };
		//this.imagecontainer.appendChild(this.imageelement);
		this.imageloading = document.getElementsByClassName("slideshow_loading", this.container)[0];
		this.imageunavailable = document.getElementsByClassName("slideshow_unavailable", this.container)[0];
		this.previouscontainer = document.getElementsByClassName("slideshow_previous", this.container)[0];
		this.previouscontainer.onclick = function() { me.previousClicked(me); };
		this.nextcontainer = document.getElementsByClassName("slideshow_next", this.container)[0];
		this.nextcontainer.onclick = function() { me.nextClicked(me); };
		this.captioncontainer = document.getElementsByClassName("slideshow_caption", this.container)[0];
		this.createSlideShowTooltip();
	},
	createSlideShowTooltip:function() {
		this.imagetooltip = document.createElement("DIV");
		this.imagetooltip.className = "tooltip";
		this.imagetooltip.id = this.containerid + "_imagePopUp";
		this.imagetooltip.style.display = "none";
		document.body.appendChild(this.imagetooltip);
		Tooltips.activate();
		this.tooltipcreated = true;
	},
	imageClicked:function(ss) {
		ss.observers.each( function(observer) {
			observer(ss.imagedata[ss.currimageindex]);
		});
	},
	previousClicked:function(ss) {
		if(!ss.swapping)
		{
			ss.currimageindex--;
			ss.updateImage(ss);
		}
	},
	nextClicked:function(ss) {
		if(!ss.swapping)
		{
			ss.currimageindex++;
			ss.updateImage(ss);
		}
	},
	updateImage:function(ss) {
		if(ss.swapping)
		{
			if(ss.updateimageinterval == -1)
			{
				var updateImageHelper = function() {
					ss.updateImage(ss);
				};
				ss.updateimageinterval = window.setInterval(updateImageHelper, 1000);
			}
		}
		else 
		{
			if(ss.updateimageinterval != -1)
			{
				window.clearInterval(ss.updateimageinterval);
				ss.updateimageinterval = -1;
			}
			ss.showImage(ss);
		}
	},
	showImage:function(ss) {
		if(!ss.destroyed && (ss.shownimage != ss.currimageindex))
		{
			ss.swapping = true;
			new Effect.Opacity(ss.containerid, {
				duration:1,
				fps:50,
				from:1.0,
				to:0.0,
				queue:"end",
				afterFinish: function() {
					if(ss.imagesnum == 1)
					{
						ss.previouscontainer.style.visibility = "hidden";
						ss.nextcontainer.style.visibility = "hidden";
					}
					else
					{
						if(ss.currimageindex == 0)
						{
							ss.previouscontainer.style.visibility = "hidden";
							ss.nextcontainer.style.visibility = "visible";
						}
						else if(ss.currimageindex == (ss.imagesnum - 1))
						{
							ss.previouscontainer.style.visibility = "visible";
							ss.nextcontainer.style.visibility = "hidden";
						}
						else
						{
							ss.previouscontainer.style.visibility = "visible";
							ss.nextcontainer.style.visibility = "visible";
						}
					}
					ss.captioncontainer.innerHTML = ss.imagedata[ss.currimageindex].title;
					if(ss.imagedata[ss.currimageindex].loaded)
					{
						ss.imageelement.style.display = "";
						ss.imageloading.style.display = "none";
						ss.imageunavailable.style.display = "none";
						ss.imageelement.src = ss.imagedata[ss.currimageindex].thumb_url;
						ss.imagetooltip.innerHTML = ss.imagedata[ss.currimageindex].comment;
						ss.shownimage = ss.currimageindex;
						//ss.imageelement.alt = ss.imagedata[ss.currimageindex].title;
					}
					else if(ss.imagedata[ss.currimageindex].error)
					{
						ss.imageelement.style.display = "none";
						ss.imageloading.style.display = "none";
						ss.imageunavailable.style.display = "block";
						ss.shownimage = -1;
					}
					else
					{
						ss.imageelement.style.display = "none";
						ss.imageloading.style.display = "block";
						ss.imageunavailable.style.display = "none";
						ss.shownimage = -1;
					}
					if(ss.hidden)
					{
						ss.container.style.display = "";
						ss.hidden = false;
					}
					new Effect.Opacity(ss.containerid, {
						duration:1,
						fps:50,
						from:0.0,
						to:1.0,
						queue:"end",
						afterFinish: function() { 
							ss.swapping = false;
						}
					});
				}
			});
		}
	},
	addImageClickObserver:function(observer) {
		this.observers.push(observer);
	},
	destroy:function() {
		if(this.tooltipcreated) document.body.removeChild(this.imagetooltip);
		this.destroyed = true;
	}
};

var newswin;
var workswin;
var ajaxurl = 'http://www.martemilano.com/ajax.php';
var newspars = 'command=getnewshtml';
var workspars = 'command=getworkshtml';
var workpars = 'command=getworkhtml';
var serializer = new AjaxSerializer(ajaxurl);
var loadingwork = false;
/*
var observer = {
		onClose:function(a, b) {alert("Evento : " + a + ", id finestra : " + b.getId());},
		onDestroy:function(a, b) {alert("Evento : " + a + ", id finestra : " + b.getId());}
};
Windows.addObserver(observer);
*/

// Operazioni post-load
var numimagespreloaded = 0;
function checkImagesPreloaded()
{
	numimagespreloaded++;
	if(numimagespreloaded == preloadimages.length)
	{
		createWindows();
		Element.show("main_menu");
	}	
}
function doOnload()
{
	// Images preloading
	preloadimages.each( function(preloadimage, preloadimageindex) {
		var tempimg = new Image();
		tempimg.onload = function() { checkImagesPreloaded(); };
		tempimg.onerror = function() { checkImagesPreloaded(); };
		tempimg.onabort = function() { checkImagesPreloaded(); };
		tempimg.src = preloadimage;
	});
}

function createWindows()
{
	newswin = new Window('window_news', {className: "marte_window", title:"<span class=\"windows_title_adjust\">News</span>", zIndex:150, resizable: true, draggable: true, closable: true, minimizable: true, maximizable: false, width:320, height:320, minWidth:180, minHeight:50, hideEffect: ((issafari)?Element.hide:Effect.Fade), showEffect: ((issafari)?Element.show:Effect.Appear)});
	newswin.setLocation(17, 196);
	workswin = new Window('window_works', {className: "marte_window", title:"<span class=\"windows_title_adjust\">Works</span>", zIndex:150, resizable: true, draggable: true, closable: true, minimizable: true, maximizable: false, width:500, height:568, minWidth:180, minHeight:50, hideEffect: ((issafari)?Element.hide:Effect.Fade), showEffect: ((issafari)?Element.show:Effect.Appear)});
	workswin.setLocation(17, 542);
	reachwin = new Window('window_reach', {className: "marte_window", title:"<span class=\"windows_title_adjust\">About</span>", zIndex:150, resizable: false, draggable: true, closable: true, minimizable: true, maximizable: false, width:320, height:195, minWidth:160, minHeight:100, hideEffect: ((issafari)?Element.hide:Effect.Fade), showEffect: ((issafari)?Element.show:Effect.Appear)});
	reachwin.setLocation(390, 196);
	loadNews();
	loadWorks();
	loadReach();
	extrawin = new Window('window_extra', {className: "marte_window", title:"", zIndex:150, resizable: false, draggable: true, closable: true, minimizable: true, maximizable: false, width:846, height:568, minWidth:160, minHeight:100, hideEffect: ((issafari)?Element.hide:Effect.Fade), showEffect: ((issafari)?Element.show:Effect.Appear)});
	extrawin.setLocation(17, 196);
	var rand_no = Math.ceil((100*Math.random())*0.04);
	extrawin.getContent().innerHTML	= "<div style='padding:6px 0 0 4px;'><img src='images/marte" + rand_no + ".jpg?rand=" + rand_no + "' /></div>";
	extrawin.show();
}



function showNews(update)
{
	extrawin.hide();
	if(update) loadNews();
	newswin.show();
	newswin.toFront();
}

function showWorks(update)
{
	extrawin.hide();
	if(update) loadWorks();
	workswin.show();
	workswin.toFront();
}

function showReach(update)
{
	extrawin.hide();
	if(update) loadReach();
	reachwin.show();
}

function loadReach() {
	reachwin.getContent().innerHTML	= "<div id='reach'><span>Thereislifeon</span><p>Marte's core business is graphic design, focused on press, packaging and fashion design.</p><p>The goal of the collective is to translate in the most intense way their passions into work.</p><br/><span>Reach</span><p>Via Pestalozzi, 1 - 20143 Milano</p><p><a href='mailto:contact@martemilano.com'>contact@martemilano.com</a></p></div>";
}

function loadNews()
{
	Element.hide('newslink');
	Element.show('newsloading');
	newswin.setTitle('loading...');
	serializer.request({ method: 'get', parameters: newspars, onComplete: populateNewsWindow });
}

function loadWorks()
{
	Element.hide('workslink');
	Element.show('worksloading');
	workswin.setTitle('loading...');
	serializer.request({method: 'get', parameters: workspars, onComplete: populateWorksWindow });
}

function loadWork(workid, worktitle)
{
	if(!loadingwork)
	{
		loadingwork = true;
		var workwin = Windows.getWindow('window_work' + workid);
		if(workwin)
		{
			workwin.setTitle("loading work...");
			workwin.setSize(200,1);
			if(!workwin.isMinimized()) workwin.minimize();
			workwin.showCenter();
			workwin.getContent().innerHTML = "";
			serializer.request({method: 'get', parameters: workpars + "&workid=" + workid, onComplete: function(originalRequest) { populateWorkWindow(originalRequest, workid, worktitle);} });
		}
		else
		{
			workwin = new Window('window_work' + workid, {
				className: "marte_window", 
				title:"loading work...", 
				zIndex:150, resizable: false, 
				draggable: true, 
				closable: true, 
				minimizable: true, 
				maximizable: false, 
				width:200, 
				height:1, 
				minWidth:420, 
				minHeight:500, 
				hideEffect: Element.hide, 
				showEffect: ((issafari)?Element.show:Effect.Appear),
				showEffectOptions: {
					afterFinish: function() {
						if(!issafari)
						{
							workwin.showEffectOptions = false;
							serializer.request({method: 'get', parameters: workpars + "&workid=" + workid, onComplete: function(originalRequest) { populateWorkWindow(originalRequest, workid, worktitle);} });
						}
					}
				}
			});
			workwin.setDestroyOnClose();
			if(!workwin.isMinimized()) workwin.minimize();
			workwin.showCenter();
			if(issafari) serializer.request({method: 'get', parameters: workpars + "&workid=" + workid, onComplete: function(originalRequest) { populateWorkWindow(originalRequest, workid, worktitle);} });
		}		
	}
}

function populateNewsWindow(originalRequest)
{
	newswin.getContent().innerHTML = originalRequest.responseText;
	newswin.setTitle("<span class=\"windows_title_adjust\">News</span>");
	Element.hide('newsloading');
	Element.show('newslink');
}
function populateWorksWindow(originalRequest)
{
	workswin.getContent().innerHTML = originalRequest.responseText;
	sortables_init();
	workswin.setTitle("<span class=\"windows_title_adjust\">Works</span>");
	Element.hide('worksloading');
	Element.show('workslink');
}

function imageClicked(image)
{
	if(image.type == "image")
	{
		var imagewin = Windows.getWindow('window_image' + image.id);
		if(imagewin)
		{
			imagewin.toFront();
			if(imagewin.isMinimized()) imagewin.minimize();
		}
		else
		{
			var imageobj = new Image();
			var imagewin = new Window('window_image' + image.id, {
				className: "marte_window", 
				title:"loading image...", 
				zIndex:150, 
				resizable: false, 
				draggable: true, 
				closable: true, 
				minimizable: true, 
				maximizable: false, 
				width:200, 
				height:1, 
				hideEffect: Element.hide, 
				showEffect: ((issafari)?Element.show:Effect.Appear),
				showEffectOptions: {
					afterFinish: function() {
						if(!issafari)
						{
							imagewin.showEffectOptions = false;
							imageobj.src = image.image_url;
						}
					}
				}
			});
			imagewin.setDestroyOnClose();
			if(!imagewin.isMinimized()) imagewin.minimize();			
			var imagetooltip = document.createElement("DIV");
			imagetooltip.innerHTML = image.comment;
			imagetooltip.className = "tooltip";
			imagetooltip.id = "image" + image.id + "PopUp";
			imagetooltip.style.display = "none";
			imageobj.onload = function() {
				if(Windows.getWindow('window_image' + image.id))
				{
					//imagewin.getContent().appendChild(imageobj);
					imagewin.hide();
					imagewin.getContent().innerHTML = '<div class="image_window"><img src="' + image.image_url + '" id="image' + image.id + '" class="tooltipTrigger" /></div>';
					imagewin.setSize(parseInt(imageobj.width)+23, parseInt(imageobj.height)+23);
					document.body.appendChild(imagetooltip);
					Windows.addObserver({onDestroy:function(eventName, win) { if(win == imagewin) document.body.removeChild(imagetooltip); }});
					Tooltips.activate();
					imagewin.setTitle(image.title);
					
					if(imagewin.isMinimized()) imagewin.minimize();
					imagewin.showCenter();
				}
			};
			imagewin.showCenter();
			if(issafari) imageobj.src = image.image_url;
		}
	}
	else if(image.type == "swf")
	{
		var swfwin = Windows.getWindow('window_swf' + image.id);
		if(swfwin)
		{
			if(swfwin.isMinimized()) swfwin.minimize();
		}
		else
		{
			var swfwin = new Window('window_swf' + image.id, {className: "marte_window", title:image.title, zIndex:150, resizable: false, draggable: true, closable: true, minimizable: true, maximizable: false, width:parseInt(image.swf_width)+3, height:parseInt(image.swf_height)+3, hideEffect: Element.hide, showEffect: ((issafari)?Element.show:Effect.Appear)});
			swfwin.setDestroyOnClose();
			var swfobj = new SWFObject(image.swf_url, "swf_" + image.id, image.swf_width, image.swf_height, "7", "#000000");
			swfobj.write(swfwin.getContent().id);
		}
		swfwin.showCenter();
	}
}

function populateWorkWindow(originalRequest, id, worktitle)
{
	eval("var jsonarray = " + originalRequest.getResponseHeader("X-JSON") + ";");
	var workwin = Windows.getWindow('window_work' + id);
	if(workwin)
	{
		workwin.hide();
		workwin.setTitle(worktitle);
		workwin.setSize(400,200);
		workwin.getContent().innerHTML = originalRequest.responseText;
		var ss = new SlideShow(jsonarray, 'work_slideshow_' + id, 5);
		ss.addImageClickObserver(imageClicked);
		Windows.addObserver({onDestroy:function(eventName, win) { if(win == workwin) ss.destroy(); }});
		if(workwin.isMinimized()) workwin.minimize();
		workwin.showCenter();
	}
	loadingwork = false;
}

// Funzioni di visualizzazione
function openNew(id)
{
	$("newstitle-" + id).style.display = "none";
	$("newsbody-" + id).style.display = "block";
	return false;
}
function closeNew(id)
{
	$("newsbody-" + id).style.display = "none";
	$("newstitle-" + id).style.display = "block";
	return false;
}
