Anastasis.SerenaUtils=function(){}

/**
 * Stampa il contenuto del div 'cosa' (di default 'content') con i css passati
 */
Anastasis.SerenaUtils.print=function(cosa)
{
	if(!cosa) cosa="content";
	var divToPrint=document.getElementById(cosa);
	if(!divToPrint)
	{
		alert("[Anastasis.Utils.print]\nImpossibile stampare il contenuto di "+cosa);
		return false;
	}

	var header="<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>" +
	  "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='it' lang='it'>" +
	  "<head>" +
	  "<title>Anteprima di stampa</title>"+
	  "<link href='/"+anastasis.servletContext+"/app/Template/metaAmbiente/common.css' rel='stylesheet' type='text/css' />"+
	  "<link href='/"+anastasis.servletContext+"/app/Template/metaAmbiente/print.css' rel='stylesheet' type='text/css' />"+
	  "</head>";

  	header+="<body id='home'>" +
	  	    "<div id='wrap'><div id='main'><div id='da_stampare'><div id='"+cosa+"'>";
	w=window.open("","STAMPA","toolbar=no,menubar=no,personalbar=no,width=800,height=600,resizable=yes,scrollbars=yes,modal=yes,dependable=yes");
	w.document.write(header);
	w.document.write(divToPrint.innerHTML);
	w.document.write("</div></div></div></div></body></html>");
	w.document.close();
	w.print();
	w.close();
	return false;
}

Anastasis.SerenaUtils.getDataDiOggi=function()
{
	var theMonth = new Date().getMonth()+1;
	return new Date().getDate()+"/"+theMonth+"/"+new Date().getFullYear();
}

Anastasis.SerenaUtils.getInputInfo=function(input,info)
{
	var rep="";
	if(document.getElementById("info_"+input.id))
	{
		var infostring=document.getElementById("info_"+input.id).value;
		var reg=new RegExp(info+'=(.*?)(\\||$)');
		var tmp=infostring.match(reg);
		if(tmp) rep=tmp[1];
	}
	if(!rep && document.getElementById(info+"_"+input.id))
	{
		rep=document.getElementById(info+"_"+input.id).value;
	}
	return rep;
}

Anastasis.SerenaUtils.confirmMessage=function(title,text,okaction,onclose,onopen,width,height,draggable)
{
	$dialog=$('<div title="'+title+'">'+text+"</div>");

	if(!width) width=300;
	if(!height) height=200;

	$dialog.dialog({
			bgiframe: true,
			autoOpen: true,
			width: width,
			height: height,
			modal: true,
			draggable: draggable,
			closeOnEscape: false,
			open: function(event, ui) { if(typeof(onopen)=="function") onopen($dialog); },
			close: function() { if(typeof(onclose)=="function") onclose($dialog); else $(this).remove(); },
			buttons: {
						'Si': function() {$(this).dialog('close');okaction()},
						'No': function() {$(this).dialog('close')}
					 }
		});
	return false;
}

Anastasis.SerenaUtils.popupMessage=function(title,text,onclose,onopen,width,height,draggable)
{
	$dialog=$('<div title="'+title+'">'+text+"</div>");

	if(!width) width=350;
	if(!height) height=220;

	$dialog.dialog({
			bgiframe: true,
			autoOpen: true,
			width: width,
			height: height,
			modal: true,
			draggable: draggable,
			closeOnEscape: false,
			open: function(event, ui) { if(typeof(onopen)=="function") onopen($dialog); },
			close: function() { if(typeof(onclose)=="function") onclose($dialog); else $(this).remove(); },
			buttons: {
						'Ok': function() {$(this).dialog('close');}
					 }
		});


	return false;
}

Anastasis.SerenaUtils.postFilter=function(url,info)
{
	$form=$("<form>");
	$form.attr("action",url);
	$form.attr("method","POST");

	var categorie=info.split("@cat@");
	for(var i=0;i<categorie.length;i++)
	{
		var valori=categorie[i].split("@val@");

		var name=valori[0];
		if(name.match("."))
		{
			name=name.split(".");
			name=name[name.length-1];
		}

		var $type=$("<input>");
		$type.attr("name",name+"type");
		$type.attr("value","and");
		$form.append($type);

		for(var h=1;h<valori.length;h++)
		{
			var $input=$("<input>");
			$input.attr("name","KEY_"+name);
			$input.attr("value",valori[h] ? valori[h] : "null");
			$form.append($input);
		}
	}

	$("body").append($form);
	$form.submit();
}

//-----------FOLDING----------------------

Anastasis.SerenaUtils.openFoldingLink=function(linkOrLi)
{	
	var $li=null;
	if($(linkOrLi).is("li")) $li=$(linkOrLi);
	else $li=$(linkOrLi).closest("li");
	
	$li.removeClass("folding_closed");
	$li.closest("li").addClass("folding_opened");
	$li.closest("li").children("ul").show();	
}

Anastasis.SerenaUtils.closeFoldingLink=function(linkOrLi)
{	
	var $li=null;
	if($(linkOrLi).is("li")) $li=$(linkOrLi);
	else $li=$(linkOrLi).closest("li");
	
	$li.addClass("folding_closed");
	$li.removeClass("folding_opened");
	$li.children("ul").hide();	
}

Anastasis.SerenaUtils.toggleFoldingLink=function(linkOrLi)
{
	var $li=null;
	if($(linkOrLi).is("li")) $li=$(linkOrLi);
	else $li=$(linkOrLi).closest("li");
	
	if($li.hasClass("folding_closed"))
		Anastasis.SerenaUtils.openFoldingLink(linkOrLi);
	else
		Anastasis.SerenaUtils.closeFoldingLink(linkOrLi)
}

Anastasis.SerenaUtils.openAllFoldingLinks=function()
{
	$("li.folding_closed").each(function(){				
		Anastasis.SerenaUtils.openFoldingLink(this);		
	});
}

Anastasis.SerenaUtils.closeAllFoldingLinks=function()
{
	$("li.folding_opened").each(function(){				
		Anastasis.SerenaUtils.closeFoldingLink(this);		
	});
}

//-----------DATE----------------------

/**
 * Attiva il datepicker su un input text.
 * Se e' un datepicker per un data-ora in un filtro, deve aggiungere 00:00 se e' from e 23:59:59 se e' to.
 * Se e' un datepicker di un data-ora di un detail-edit o complex, chiama la funzione per compilare il campo nascosto con la data da inviare.
 * @param input_id l'id dell'input (non deve iniziare con #)
 * @param isFilterDateHour specifica se e' un campo data/ora di un filtro
 * @param nel caso sia un campo data ora, specifica se e' il campo from o il campo to
 */
Anastasis.SerenaUtils.activateDatePicker=function(input_id,isFilterDateHour,isFrom)
{
	var input=document.getElementById(input_id);	
	var onSelect=function(dateText){$(this).val(dateText);};
	
	//E' un date-time di un filtro (nb: per oscuri motivi la' il template si chiama date-hour)
	if(isFilterDateHour)
	{
		onSelect=function(dateText){
			if(isFrom)
			{
				$(this).val(dateText+" 00:00:00");
			}
			else
			{
				$(this).val(dateText+" 23:59:59");
			}
		};
	} 
	else	// detail-edit o complex o filter non date-time
	{
		//E' un date-time di un detail-edit o complex
		if($(input).hasClass("date-time"))
		{
			
			var compose_datetime=function(name)
			{
				var data=$(document.getElementById('data_'+name)).val();
				if(data)
				{
					var ora=$(document.getElementById('ora_'+name)).val();
					var minuti=$(document.getElementById('minuti_'+name)).val();
					$(document.getElementById(name)).val(data+" "+ora+":"+minuti+":00");
				}
			}
			
			var real_input_name=input_id.match(/data_(.*)/)[1];
			$(document).ready(function() {				
				$("#data_"+real_input_name+",#ora_"+real_input_name+",#minuti_"+real_input_name).change(function(){compose_datetime(real_input_name);});
			});			
		}
		//Sia date-time che normale campo date
			onSelect=function(dateText){
				$(this).change();			
			};
		}
		
	$(document).ready(function() {		
		$(input).datepicker($.extend(
										{
											changeMonth: true,
											changeYear: true,
											yearRange: '1900:2100', 
											buttonText: '',
											showOn: 'button',
											buttonImage: 'app/Template/metaAmbiente/img/icon-calendar.gif',
											buttonImageOnly: true,
											onSelect: onSelect
										},$.datepicker.regional['it'] ) );
	});
}

/**
 * Parse a given String representing a date.
 * Supports following date formats: dd/mm/aaaa | dd/mm/aaaa hh:mm:ss
 * @param dateString la stringa che rappresenta la data
 * @returns un oggetto javascript Date
 */
Anastasis.SerenaUtils.parseDate=function(dateString)
{
	var day,month,year,hour,minute,second;
	var parsed=dateString.match(/^\s*(\d\d)\/(\d\d)\/(\d\d\d\d)\s*$/);
	if(parsed)
	{
		day=parsed[1];
		month=parseInt(parsed[2])-1;
		year=parsed[3];		
		hour=0;
		minute=0;
		second=0;
	}
	else
	{
		parsed=dateString.match(/^\s*(\d\d)\/(\d\d)\/(\d\d\d\d)\s+(\d\d):(\d\d):(\d\d)\s*$/);
		if(parsed)
		{
			day=parsed[1];
			month=parseInt(parsed[2])-1;
			year=parsed[3];
			hour=parsed[4];
			minute=parsed[5];
			second=parsed[6];	
		}
		else
		{
			throw "Unsupported date format";
		}
	}
	return new Date(year,month,day,hour,minute,second);
}

Anastasis.SerenaUtils.enhanceDateInputs=function(scope)
{
	$("input.input_date.enhanced",$(scope)).each(function(){
							if($(this).closest("div.gruppo_add").length>0) return;	//sta dentro un bottone add del complex
							if($(this).is(":disabled") || ($(this).attr("readonly")==true)) return;
							Anastasis.SerenaUtils.activateDatePicker($(this).attr("id"));
						});
}

//-----------HISTORY--------------------

Anastasis.SerenaUtils.onHistoryStatechange=function()
{
	var State = History.getState();	        
	if(State.data.state=="no-back-button")
	{
		var url=State.url;
		url=url.replace("no-back-button","standard")
		if(url.match(/^http:/))
		{
			try{url="?"+url.match(/.*\?(.*)/)[1];}catch(e){url="";}
		}
		
		History.pushState({state:"standard"}, $("title").text(), url);
	}    
}

Anastasis.SerenaUtils.disableBackButton=function()
{
	if (History.enabled)
	{ 		
		var new_href="?state=no-back-button";
		if(window.location.href.match(/state=/))
		{
			new_href="?"+window.location.href.match(/.*\?(.*)/)[1];
			new_href=new_href.replace(/state=([^&]*)/,"state=no-back-button");
		}
		else if(window.location.href.match(/\?/))
		{
			new_href=new_href + "&" + window.location.href.match(/.*\?(.*)/)[1];
		}
		else if(window.location.href.match(/Index$/))
		{
			new_href="Index?state=no-back-button";
		}		
		History.pushState({state:"no-back-button"}, $("title").text(), new_href);
	}
	else
	{
		anastasis.logger.warn("History not enabled: does this browser support HTML 5? Have you included History js files in javascript_base_headings?");
	}
}

//-----------SELECT-MULTIPLE------------

Anastasis.SerenaUtils.enhanceMultipleSelect=function(scope)
{
	if(!scope) scope=$("body");
	else scope=$(scope);
	
	//Funzionalita' valida sempre, utile per Serena: se non seleziono niente, si autoseleziona l'opzione vuota
	$("select[multiple]",scope).change(function(){			
			if($("option:selected",$(this)).length==0)
			{
				$("option[value='']",$(this)).attr("selected",true);
			}
			else if($("option:selected",$(this)).length>1)
			{
				$("option[value='']",$(this)).attr("selected",false);
			}
		});
	
	//Solo se la select ha la classe enhanced, usiamo bsmSelect
	//Attenzione nel complex detail edit a non applicarlo all'HTML nascosto che aagiunge nuove istanze!
	if($.bsmSelect)
	{
		$("select[multiple].enhanced",scope).each(function(){
				if($(this).closest("div.gruppo_add").length>0) return;	//sta dentro un bottone add del complex							
				if($(this).hasClass("select_relazione_filtrata")) return;
				$("option[value='']",$(this)).attr("selected",false);	//fa si' che non si veda l'opzione 'non specificato'
				$(this).bsmSelect({
					addItemTarget: 'top',
			        animate: true,
			        highlight: true,
			        removeLabel: 'rimuovi',
			        title: 'Scegli...'
				});
				if($("option:selected",$(this)).length==0)	//se era l'unica, rimette l'opzione 'non specificato' (ma non si vede)
				{
					$("option[value='']",$(this)).attr("selected",true);
				}
		});
		//Fondamentale, senno' lo invia e Serena si incasina
		$("select.bsmSelect",scope).removeAttr("name");
	} 
	else if($("select[multiple].enhanced").length>0)
	{
		anastasis.logger.info("Unable to find bsmSelect, multiple select will not be enhanced.");
	}
}

//---------------- TABs ------------------

Anastasis.SerenaUtils.getCurrentTabSheetFromUrl=function(){
	var currentTab = getUrlVars()["active"];
	$("#"+currentTab).addClass('ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-focus');
}

Anastasis.SerenaUtils.getCurrentTabSheet=function(currentTab){
	$("#"+currentTab).addClass('ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-focus');
}

//---------------INIT-------------------

Anastasis.SerenaUtils.initContent=function(scope)
{
	if(!scope) scope=$("body");
	else scope=$(scope);
	
	$("li.folding_closed,li.folding_opened",scope).each(function(){				
		if($(this).hasClass("folding_closed")) $(this).children("ul").hide();				
	});

	$("li.folding_closed > a,li.folding_opened > a",scope).each(function(){							
		$(this).click(function(){Anastasis.SerenaUtils.toggleFoldingLink(this); return false;});
	});
	
	Anastasis.SerenaUtils.enhanceMultipleSelect(scope);
	Anastasis.SerenaUtils.enhanceDateInputs(scope);
	
}

Anastasis.SerenaUtils.initHistory=function()
{
	if(typeof(History)!=='object') { return; }
	if (History.enabled ) 
	{
		 History.Adapter.bind(window,'statechange',Anastasis.SerenaUtils.onHistoryStatechange);
	}
}

//---------------MAIN-------------------

$(document).ready(function(){			
		Anastasis.SerenaUtils.initContent();
		Anastasis.SerenaUtils.initHistory();
	});
