/**

Author			: Fabio Bonacina
Version			: 1.0.06
Created			: 21/08/2008
Last Modified	: 06/10/2009
Description		: area, sections, menu and commands management
Modifications	: 
	- changed default of find parameter in sitearea_summary(): now it's false
	- added filter management: sitearea_summary()
	- modified addSetcions(): substituted xml_* functions with jQuery DOM functions
	- added slider for the Sections
	- fixed markup for panel title
ToDo			: 

**/

/*
		GESTIONE DEL MENU
*/
var Menu=null;

function phMenu(user){
	this.container=null;
	return this.Init(user);
}
phMenu.prototype.Init=function(user){
	that=this;
	if(this.container==null){
		this.container=jQuery("<ul></ul>").attr({
	                id: "cms_menu"
	            }).prependTo($("#container").show());
		$("<li><a href='#'><span>Site Areas</span></a></li>").attr({
			id: "site"
		}).addClass("selected").appendTo(this.container);
		/*switch(user.type){
			case 99:
				$("<li><a href='#'><span>CMS Area</span></a></li>").attr({
					id: "cms"
				}).prependTo(this.container);
				$("<li><a href='#'><span>Personal Area</span></a></li>").attr({
					id: "personal"
				}).appendTo(this.container);
				break;
			default:
				$("<li><a href='#'><span>Personal Area</span></a></li>").attr({
					id: "personal"
				}).appendTo(this.container);
		}*/
	}
	/*$("#cms_menu li").each(function(){
		$(this).click(function(){
			$(this).siblings().removeClass("selected");
			$(this).addClass("selected");
			that.swapArea($(this).attr("id"));
		});
	});*/
	this.Init=function(){
		alert("Menu gią inizializzato");
	}
}
phMenu.prototype.swapArea=function(id){
	alert("Hai selezionato l'area " + id)
}


/*
		GESTIONE DELL'AREA DI LAVORO
*/
var Area=null;
function phArea(id){
	this.currentArea=null;
	this.$wa=null;
	this.$editor=null;
	this.$actions=null;
	this.$sections=null;
	this.$listitems=null;
	this._tester=id;
	this.site=new phSiteArea(this);
	this.personal=null;//new phPersonalArea(this);
	this.cms=null;//new phCMSArea(this);
	return this;
}
phArea.prototype.switchArea=function(id){
	switch(id){
		case "site":this.currentArea=this.site;break;
		case "personal":this.currentArea=this.personal;break;
		case "cms":this.currentArea=this.cms;break;
		default: alert("L'area '"+id+"' non esiste !");return false;
	}
	alert(Area.currentArea);
	this.currentArea.Init(this);
}
phArea.prototype.hide=function(){
	this.site.container.hide();
	//this.personal.container.hide();
	//this.hide.container.hide();
}


function phSiteArea(manager){
	this.areaManager=manager;
	this.container=null;
	this.sectionManager=null;
	this._description="Area: site Areas";
	return this.Init(manager)
}
phSiteArea.prototype.Init=function(manager){
	//	costruisco l'area
	var that=this;
	this.container=$("<div>&nbsp;</div>").attr({
		id: "area_content"
	}).addClass("content").appendTo($("#area_container"));
		//	aggiunta command panel
		$("<div></div>").attr({
				id: "editor_actions"
			}).addClass("container blue").appendTo(this.container);		
		$("<h2>")
			.html("<span>Actions</span>")
			.addClass("summary blue")
			.appendTo("#editor_actions");		
		manager.$actions=$("<ul></ul>").addClass("content").appendTo("#editor_actions");
			$("<li>Aggiungi</li>").attr({
					id: "action_create"
				}).addClass("__editor_actions disabled").appendTo(manager.$actions);
			$("<li>Modifica</li>").attr({
					id: "action_update"
				}).addClass("__editor_actions disabled").appendTo(manager.$actions);
			$("<li>Elimina</li>").attr({
					id: "action_delete"
				}).addClass("__editor_actions disabled").appendTo(manager.$actions);
		//	aggiunta contenitore per editor e listitems
		manager.$wa=$("<div></div>").attr({
				id: "workarea_container"
			}).addClass("container").appendTo(this.container);			
			// visualizzo il sommario per i dati di login
			sitearea_summary({
				 container:manager.$wa
				,listitem:false
				,editor:false
				,user:User
			});
			// aggiunta contenitore editor
			manager.$editor=$("<form></form>").attr({
				 id: "editor_container"
				,method: "post"
				,action: "gest_index.html"
			}).addClass("content").appendTo(manager.$wa);
			// aggiunta contenitore listitems
			manager.$listitems=$("<ul></ul>").attr({
				 id: "listitem_container"
			}).addClass("content").appendTo(manager.$wa);
		//	aggiunta contenitore per le sezioni attive
		$("<div></div>").attr({
				id: "site_sections"
			}).addClass("container blue").appendTo(this.container);		
		$("<h2><span>Sections</span></h2>").addClass("summary blue").appendTo("#site_sections");
		manager.$sections=$("<ul></ul>").addClass("content").appendTo("#site_sections")		
		Sections=new phSections(this,manager.$sections);
		// ripulisco i float
		$("<div>&nbsp;</div>").addClass("clear").appendTo(this.container);		
	this.Init=function(){
		that.areaManager.hide();
		that.container.show();
	}
	return this;
}
// da utilizzare per modificare l'intestazione del contenitore listitems/editor
function sitearea_summary(params){
	var opt={
		 container: null
		,listitem: true
		,chkcommands: true
		,editor: false
		,find: false
		,sectionname: ""
		,sectionmessage: ""
		,records: 0
		,user: null
	}
	opt=$.extend(opt,params);
	if(opt.container==null){
		alert("Impossibile settare il sommario della sezione");
		return false;
	}
	$(".summary",opt.container).remove();
	$("#area_welcome").remove();
	opt.container.removeClass().addClass("container");
	var summary=$("<div></div>").addClass("summary").prependTo(opt.container);
	if(opt.listitem==false && opt.editor==false){		
		opt.container.addClass("green");
		summary.addClass("green");
		var ld=$("<div></div>").css({float:"left"}).appendTo(summary);
			$("<span>Ciao "+opt.user.nickname+"&nbsp;</span><span class='tot'>(ultimo login: "+opt.user.lastSeen+")</span><br /><br />").appendTo(ld);
		var welcome=$("<div></div>").attr({id:"area_welcome"}).addClass("content").appendTo(opt.container);
		welcome.html("<div>"+Configuration.welcomeMessage+"</div>");
		return true;
	}
	opt.container.addClass("blue");
	summary.addClass("double blue");
	if(opt.listitem){
		var ld=$("<div></div>").css({float:"left"}).appendTo(summary);
			$("<span>"+opt.sectionname+"&nbsp;</span><span class='tot'>("+opt.records+")</span><br /><br />").appendTo(ld);
			var comm=$("<span></span>").attr({id:"chk_commands"}).addClass("tot").appendTo(ld).text(" | ");
			$("<a></a>").attr({
				 id: "chk_command_all"
				,href: "#"
			}).html("Seleziona tutto").prependTo(comm).click(function(e){
				$("input[type='checkbox']",Area.$listitems).check();
			});
			$("<a></a>").attr({
				 id: "chk_command_invert"
				,href: "#"
			}).html("Inverti selezione").appendTo(comm).click(function(e){
				$("input[type='checkbox']",Area.$listitems).toggleCheck();
			});
	}else{
		var ld=$("<div></div>").css({float:"left"}).appendTo(summary);
			$("<span>"+opt.sectionname+"&nbsp;</span><br /><br />").appendTo(ld);
			$("<span></span>").html(opt.sectionmessage).addClass("tot").appendTo(ld);
	}
	if(opt.find){
		var rd=$("<div></div>").css({float:"right"}).appendTo(summary);
		var s=$("<span></span>").attr({id:"listitem_search"}).appendTo(rd);
		var input=$("<input type='text' />").attr({id:"listitem_search_value",title:"scrivere almeno un carattere e premere INVIO"}).appendTo(s)
		/*$("<a></a>").attr({id:"action_search",href:"#"}).addClass("tot").html("&nbsp;cerca").appendTo(s).click(function(e){
			Sections.currentSection.find(input);
		});*/
		input.keypress(function(e){
			if(e.which == 13 && input.val()!="")Sections.currentSection.find(input);
		});
		if(Sections.currentSection.filter!=""){
			$("<a></a>")
				.attr({
					 id: "action_viewall"
					,href: "#"
					,title: "cliccare per vedere tutti gli elementi"
				})
				.addClass("tot")
				.css({
					 "position": "relative"
					,"padding-top": "5px"
				})
				.html("&nbsp;rimuovi filtro")
				.appendTo(s)
				.click(function(e){
					Sections.currentSection.currentPage=1;
					Sections.currentSection.filter="";
					Sections.currentSection.loadItems();
				});
		}
	}
	$("<div>&nbsp;</div>").addClass("clear").appendTo(summary);
}

/*
		GESTIONE DELLE SEZIONI
*/
var Sections=null;
function phSections(area,container){
	this.container=container;
	this.sections={
		"default":{
			res:"default"
			,loadItems:function(){
				Sections.beforeLoadItems();
				Sections.loadItems();
			 }
			,addItem:function(){
				Sections.beforeEditor();
				Sections.addItem();
			}
			,modItem:function(){
				Sections.beforeEditor();
				Sections.modItem();
			}
			,delItem:function(){
				Sections.beforeEditor();
				Sections.delItem();
			}
			,editor:function(){
				Sections.beforeEditor();
				Sections.editor();
			}
		}
	};
	this.currentSection=null;
	this.area=area;
	this._maxVisible=10;
	this._sections=0;
	this._currentTop=0;
	this._moveUp=null;
	this._moveDown=null;
	return this.Init(container);
}
phSections.prototype.Init=function(container){
	var that=this;
	this.container=container;
	Configuration.activityMessage="Caricamento sezioni attive in corso..";
	$.post(	"provider.aspx"
			,{
				 session: User.session
				,res: "menu"
			}
			,function(data,status){
				that.addSections(data,status,that);
			}
			,"xml"
	);
}
phSections.prototype.addSections=function(data,status,that){
	var errors=response_errors(data);
	var extraXML=response_extraxml(data);
	if(errors==null){
		var items=data.firstChild.getElementsByTagName("item");
		if(items.length>Sections._maxVisible){
			Sections._moveUp=$("<li>&nbsp;</li>")
				.attr("id","slider_move_up")
				.addClass("slider slider_up_disabled")
				.appendTo(that.container)
				.bind("mouseover mouseout",function(e){
					$(this).toggleClass("highlight");	
				})
				.click(function(){
					if(Sections._currentTop==0)return true;
					Sections._currentTop--;
					$("li:eq("+(Sections._currentTop+1)+")",that.container).css("display","block");
					$("li:eq("+(Sections._currentTop+Sections._maxVisible+1)+")",that.container).css("display","none");
					if(Sections._currentTop==0){
						Sections._moveUp
							.removeClass("slider_up_enabled")
							.addClass("slider_up_disabled");
					}else{
					}
					Sections._moveDown
						.removeClass("slider_down_disabled")
						.addClass("slider_down_enabled");
					log.info(
							 "UP  cur: "+Sections._currentTop
							);
				});
		}
		for(var i=0;i<items.length;i++){
			$("<li>"+$(items[i]).find("description:first").text()+"</li>")
				.attr({
					id:"site_section_"+$(items[i]).find("res:first").text()
					,res:$(items[i]).find("res:first").text()
					,code:$(items[i]).find("code:first").text()
				})
				.addClass("__site_sections enabled").appendTo(that.container).click(function(e){
					Sections.currentSection=Sections.sections[($("#"+this.id).attr("code")!="")?$("#"+this.id).attr("res"):"default"];
					Sections.currentSection.loadItems();
				})
				.bind("mouseover mouseout",function(e){
					$(this).toggleClass("highlight");	
				})
				.css("display",((i<Sections._maxVisible)?"block":"none"));
			//carico lo script di gestione della sezione (solo se non č gią stato caricato)
			if($(items[i]).find("code:first").text()!="")that.loadSectionCode($(items[i]).find("code:first").text(),$(items[i]).find("res:first").text());
		}
		Sections._currentTop=0;
		Sections._sections=items.length;
		log.debug("Sections_created");
		log.info(
				 "max: "+Sections._maxVisible+" - "+
				 "cur: "+Sections._currentTop+" - "+
				 "sec: "+Sections._sections+" - "
				);
		
		
		if(items.length>Sections._maxVisible){
			Sections._moveDown=$("<li>&nbsp;</li>")
				.attr("id","slider_move_down")
				.addClass("slider slider_down_enabled")
				.appendTo(that.container)
				.bind("mouseover mouseout",function(e){
					$(this).toggleClass("highlight");	
				})
				.click(function(){
					if(Sections._currentTop==Sections._sections-Sections._maxVisible)return true;
					Sections._currentTop++;
					$("li:eq("+(Sections._currentTop)+")",that.container).css("display","none");
					$("li:eq("+(Sections._currentTop+Sections._maxVisible)+")",that.container).css("display","block");
					if(Sections._currentTop==Sections._sections-Sections._maxVisible){
						Sections._moveDown
							.removeClass("slider_down_enabled")
							.addClass("slider_down_disabled")
					}else{
					}
						Sections._moveUp
							.removeClass("slider_up_disabled")
							.addClass("slider_up_enabled")
					log.info(
							 "DOWN cur: "+Sections._currentTop+"<br />"
							);
				});

		}
	}else{
		alert(errors.description+"\n"+errors.level);
	}
}
phSections.prototype.loadSectionCode=function(code,res){
	//solo se il codice non č gią stato caricato
	this.code=code;
	this.res=res;
	Configuration._ajaxErrors=Configuration.ajaxErrors;
	Configuration.ajaxErrors=this.ajaxErrors;
	var that=this;
	$.ajax.phCurrentObject=this;
	if($("#script_4_"+res).length==0){
		Configuration.activityMessage="Caricamento javascript ("+code+") in corso..";
		$.ajax({
			 async: false
			,url: "libs/"+this.code
			,type: "get"
			,dataType: "text"
			,success: function(data,status){
					that.loadSectionCode_Done(data,that.res);
				}
		});
	}
	
}
phSections.prototype.ajaxErrors=function(req,status,err){
	// se non č stato possibile recuperate il codice elimino la sezione
	$("#site_section_"+$.ajax.phCurrentObject.res).removeClass("__site_sections enabled").addClass("disabled").unbind();
	//risistemo il gestore originale
	Configuration.ajaxErrors=Configuration._ajaxErrors;
}
phSections.prototype.loadSectionCode_Done=function(data,res){
	log.info("Loaded script for resource: "+res);
	$("<script>"+data+"</script>").appendTo(document.body);
	//risistemo il gestore originale
	Configuration.ajaxErrors=Configuration._ajaxErrors
}

/*
	Funzionalitą comuni per tutte le sezioni
*/
phSections.prototype.beforeLoadItems=function(){
	this.area.areaManager.$editor.hide();
	Sections.setActions(true,false,false);
	Sections.currentSection.selectedItems=0;
	if(Sections.currentSection.form)Sections.currentSection.form=Sections.currentSection.form.clean();
	this.area.areaManager.$editor.empty();
}
phSections.prototype.checkbox_customClick=function(container){
	$("input[type='checkbox']",container).bind("click",function(e,triggered){
		e.stopPropagation();
		// se ho cliccato sulla checkbox la this.checked ha gią il valore corretto, altrimenti non č ancora cambiato..
		if(triggered=="triggered"){
			Sections.currentSection.selectedItems+=(this.checked?(-1):1);
		}else{
			Sections.currentSection.selectedItems+=(this.checked?1:(-1));
		}
		Sections.setActions(true,(Sections.currentSection.selectedItems==1)?true:false,(Sections.currentSection.selectedItems>=1)?true:false);
		if(typeof Sections.currentSection.checkbox_afterClick=="function")Sections.currentSection.checkbox_afterClick();
	});
}
phSections.prototype.beforeEditor=function(){	
	this.area.areaManager.$listitems.hide();
	Sections.setActions(true,false,true);
}
phSections.prototype.sendData=function(data,callback,message){
	/*var d=$.extend({
			 session:User.session
			,res:Sections.currentSection.res},data);
	p(d);return false;*/
	if(message){
		Configuration.activityMessage=message;
	}else{
		switch(data.act){
			case "add":
				Configuration.activityMessage="Creazione nuovo elemento";break;
			case "mod":
				Configuration.activityMessage="Modifica elemento";break;
			case "del":
				Configuration.activityMessage="Eliminazione elemento/i";break;
			default:
				Configuration.activityMessage="Azione non riconosciuta ";
		}
	}
	var d = new Date();
	Configuration.activityMessage+=" in corso..";
	$.post(	"manager.aspx"
			,$.extend({
			 session:User.session
			,sj08iuq1:String(d.getMilliseconds()*7393+d.getMinutes())
			,res:Sections.currentSection.res},data)
			,function(data,status){
				callback(data,status,null);
				//alert(data);
			}
			,"xml"
			//"text"	
	);
	function p(data){
		for(var i in data){
			alert(i+":"+data[i]);
		}
	}
}
// settaggi del pannello delle azioni
phSections.prototype.setAction=function(action,state){
	var id="";
	switch(action){
		case "add":id="#action_create";break;
		case "mod":id="#action_update";break;
		case "del":id="#action_delete";break;
	}
	if(state){
		$(id,Area.$actions)
			.removeClass("disabled highlight")
			.addClass("enabled")
			.click(function(e){
				Sections.currentSection.addItem(e);
			})
			.bind("mouseover mouseout",function(e){
				$(this).toggleClass("highlight");
		});
	}else{
		$(id,Area.$actions)
			.removeClass("enabled highlight")
			.addClass("disabled")
			.unbind()
			.bind("mouseover mouseout",function(e){
				$(this).toggleClass("highlight");
		});
	}
}
//	unbinds alla extraactions and removes them from the pan
phSections.prototype.destroyExtraActions = function(){
	$("li.__editor_extraactions").unbind().remove();
}
phSections.prototype.setActions=function(add,mod,del){
	var all=$("li.__editor_actions");
	all.removeClass("disabled enabled highlight").unbind();
	if(add){
		$("#action_create",Area.$actions).addClass("enabled").click(function(e){
						Sections.currentSection.addItem(e);
					});
	}else{
		$("#action_create",Area.$actions).addClass("disabled");
	}
	if(mod){
		$("#action_update",Area.$actions).addClass("enabled").click(function(e){
						Sections.currentSection.modItem(e);
					});
	}else{
		$("#action_update",Area.$actions).addClass("disabled");
	}
	if(del){
		$("#action_delete",Area.$actions).addClass("enabled").click(function(e){
						Sections.currentSection.delItem(e);
					});
	}else{
		$("#action_delete",Area.$actions).addClass("disabled");
	}

	//	delete all commands from the panel except ADD,MOD,DEL
	Sections.destroyExtraActions();
	//	added for eventual extra commands (i.e. Newsletter section: send newsletter, send confirmation email..)
	if(typeof Sections.currentSection.buildExtraActions=="function")Sections.currentSection.buildExtraActions();

	//	adding highligth managers
	$("li.__editor_actions:not(.disabled)").each(function(){
		$(this).bind("mouseover mouseout",function(e){
			$(this).toggleClass("highlight");
		});
	});		

	//	added for eventual extra commands (i.e. Newsletter section: send newsletter, send confirmation email..)
	if(typeof Sections.currentSection.bindExtraActions=="function")Sections.currentSection.bindExtraActions();
}
// richiama la corretta funzione di ricerca elemento
phSections.prototype.find=function(o){
	alert("phSections_find(): "+o.attr("value"));
}
phSections.prototype.loadItems=function(o){
	Sections.beforeLoadItems();
	alert("implementare loadItems() per la risorsa '"+Sections.currentSection.res+"'");
}
phSections.prototype.editor=function(o){
	Sections.beforeEditor();
	alert("implementare editor() per la risorsa '"+Sections.currentSection.res+"'");
}
phSections.prototype.addItem=function(o){
	Sections.beforeEditor();
	alert("implementare addItem() per la risorsa '"+Sections.currentSection.res+"'");
}
phSections.prototype.modItem=function(o){
	Sections.beforeEditor();
	alert("implementare modItem() per la risorsa '"+Sections.currentSection.res+"'");
}
// di default recupera gli id degli elementi selezionati (se siamo nel listitems) oppure l'id dell'elemento in modifica..
phSections.prototype.delItem=function(o){
	return Sections.collectIddel();
}
phSections.prototype.collectIddel=function(){
	var obj={
		 iddel:""
		,editing:null
	};
	if(Sections.area.areaManager.$listitems.css("display")!="none"){
		obj.editing=false;
		$("input[type='checkbox']",Sections.area.areaManager.$listitems).each(function(){
			if(this.checked){
				obj.iddel+=(obj.iddel.length>0?",":"")+$(this).parents("li:first").attr("id");
			}
		});		
	}else{
		obj.editing=true;
		obj.iddel=$("#iddel",Sections.area.areaManager.$editor).attr("value");
	}
	return obj
}
