/**
 * Main .js object
 * ar trebui sa se comporte ca MAI MULT decat un simplu container.
 */
var XANDER = function(params, xmlPagina){

	this.getParam = function(param) {
		if ( params[param] ) {
			return params[param];
		}
		
		return null;
	};
	
	this.getxmlPagina = function(item) {
		if ( xmlPagina[item] ) {
			return xmlPagina[item];
		}
		
		return '';
	};
	
	this.init = function() {
		prepareParams();
	};
	
	function prepareParams(){
		params['evThisYear'] = cleanYear( parseInt(params['evThisYear']) );
		params['evThisMonth'] = cleanMonth( parseInt(params['evThisMonth']) );
		params['evThisDay'] = cleanDay( parseInt(params['evThisDay']) );
		params['thisYear'] = cleanYear( parseInt(params['thisYear']) );
		params['thisMonth'] = cleanMonth( parseInt(params['thisMonth']) );
	}
	
	function cleanYear(year) {
		if ( isNaN(year) || year < 0 ) {
			var splitDate = params['today'].split('-');
			year = splitDate[0];
		}
		
		return parseInt(year);
	};
	
	function cleanMonth(month) {
		if ( isNaN(month) || month < 1 || month > 12 ) {
			var splitDate = params['today'].split('-');
			month = splitDate[1];
		}
		
		return parseInt(month);
	};
	
	function cleanDay(day) {
		if ( isNaN(day) || day < 1 || day > 31 ) {
			var splitDate = params['today'].split('-');
			day = splitDate[2];
		}
		
		return parseInt(day);
	};
};





/*-----------------------------------------------------------------------------------------*/
/** 
 * Banner
 */
XANDER.prototype.slide = function(optiuniBanner) {
	var slideImage		= null;
	var controlImage	= new Array();
	var activ 			= null;
	var bucati 			= null;
	var defaults		= {
		slideImage 		: 'slideImage',		//ID
		numarImagini	: 4,
		interval 		: 5000,
		slideControl 	: 'slideControl',	//ID
		caleImgCtrl		: 'public/css/images'
	};
	optiuni				= $.extend({}, defaults, optiuniBanner);
	
	/**
	 * initializeaza banner-ul
	 */
	this.init = function() {
		slideImage		= $('#' + optiuni.slideImage + ' > a');
		
		bucati = slideImage.size();
		
		if ( bucati <= 0 ) return true;
		
		if (bucati > optiuni.numarImagini) { 
			bucati = optiuni.numarImagini; 
		}
		
		controlInit();
		
		activ = 1;
		afiseazaSlide(activ);
		controlImage[activ].each(function(index){
			if (index == 0) { $(this).css('display', 'none'); }
			else 			{ $(this).css('display', 'block'); }
		});
		
		window.setInterval (autochange, optiuni['interval']);
	};
	
	/**
	 * initializeaza meniul de control si ataseaza evenimentele necesare
	 */
	function controlInit() {
		var IDslideControl	= $('#' + optiuni.slideControl);
		
		//setez control <<anterior>>
		var toAppend = '<div id="linkSlideP"><img style="padding-left:11px;" src="'+ sursaImagineControl('prev') +'" /></div>';
		IDslideControl.append(toAppend);
		
		$("#linkSlideP").click(function() {
			var prevSlide = prevNext('prev');
			afiseazaSlide(prevSlide);
			seteazaControlActiv(prevSlide);
		});
		
		//setez controlurile 1..bucati
		for (var i=1; i<=bucati; i++) {
			toAppend = '<div id="linkSlide'+ i +'">'+
							'<img css="display:block" src="'+ sursaImagineControl(i) +'" />'+
							'<img css="display:hidden" src="'+ sursaImagineControl(i,'_a') +'" />'+
						'</div>';
			IDslideControl.append(toAppend);
			
			$("#linkSlide"+i).click({id:i},
					function(event) {
						afiseazaSlide(event.data.id);
						seteazaControlActiv(event.data.id);
					}
			);
			
			controlImage[i] = $("#linkSlide"+i+' > img');
		}
		
		//setez control <<urmator>>
		var toAppend = '<div id="linkSlideN"><img src="'+ sursaImagineControl('next') +'" /></div>';
		IDslideControl.append(toAppend);

		$("#linkSlideN").click(function() {
			var nextSlide = prevNext('next');
			afiseazaSlide(nextSlide);
			seteazaControlActiv(nextSlide);
		});
	};
	
	/**
	 * functia callback pentru schimbare automata
	 */
	function autochange() {
		var nextSlide = prevNext('next');
		afiseazaSlide(nextSlide);
		seteazaControlActiv(nextSlide);
	};
	
	/**
	 * afiseaza slideul @slideNou
	 * @param slideNou
	 */
	function afiseazaSlide(slideNou) {
		slideImage.each(function(index){
			if (index + 1 == slideNou) {
				$(this).css('display', 'block');
			}
			else {
				$(this).css('display', 'none');
			}
		});
	};
	
	/**
	 * determina id-ul urmatorului slide in functie de @directia
	 * @param directia = 'prev' sau 'next'
	 * @returns
	 */
	function prevNext(directia) {
		var returnSlide = null;
		if (directia == 'prev') {
			returnSlide = ( activ == 1 ) ? bucati : activ - 1;
		}
		else if (directia == 'next') {
			returnSlide = ( activ == bucati ) ? 1 : activ + 1;
		}
		
		return returnSlide;
	};

	/**
	 * seteaza controlul @slideNou ca activ, in acelasi timp il dezactiveaza pe fostul activ
	 * @param slideNou
	 */
	function seteazaControlActiv(slideNou) {
		controlImage[activ].each(function(index){
			if (index == 0) { $(this).css('display', 'block'); }
			else 			{ $(this).css('display', 'none'); }
		});
		
		controlImage[slideNou].each(function(index){
			if (index == 0) { $(this).css('display', 'none'); }
			else 			{ $(this).css('display', 'block'); }
		});
		
		activ = slideNou;
	};
	
	/**
	 * construieste calea catre imaginea de control
	 * @param controlId
	 * @param controlActiv
	 * @returns {String}
	 */
	function sursaImagineControl(controlId, controlActiv) {
		if (controlActiv == null) { controlActiv = '';}
		return xander.getParam('root') + '/workspace/' + optiuni.caleImgCtrl + '/slideOrder_' + controlId + controlActiv + '.png';
	};
};





/*-----------------------------------------------------------------------------------------*/
/**
 * Deschide fereastra noua pentru linkurile de pe pagina de Clienti
 * @param url
 * @param winName
 */
function centeredPopup(url,winName){
	w = 820;
	h = 600;
	scroll = 'yes';
	LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
	TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
	settings = 	'height='+h+
				',width='+w+
				',top='+TopPosition+
				',left='+LeftPosition+
				',scrollbars='+scroll+
				',resizable';
	window.open(url,winName,settings);
}





/*-----------------------------------------------------------------------------------------*/
/**
 * tooltips pentru limbile in care este disponibil site-ul
 */
XANDER.prototype.limbaSite = function() {
	this.init = function() {
		$('#limbaSite a').tooltip({ 
		    track: true, 
		    delay: 0, 
		    showURL: false, 
		    showBody: " - ", 
		    opacity: 1,
		    fade: 0 
		});
	};
};





/*-----------------------------------------------------------------------------------------*/
/**
 * Meniul din stanga
 */
XANDER.prototype.menu = function() {
	this.init = function() {

		//submeniurile necesare
		var magazineleArc 		= new subMeniu('magazine','magazineleArc');
		var evenimenteSiStiri 	= new subMeniu('evenimenteSiStiri','evenimenteSiStiri');
		var certificari			= new subMeniu('certificari','certificari');
		var parteneri			= new subMeniu('parteneri','parteneri');
		
		//starea initiala
		magazineleArc.init();
		evenimenteSiStiri.init();
		certificari.init();
		parteneri.init();
		
		//stari intermediare
		magazineleArc.getNode().click(function(){
			magazineleArc.playMenu();
			evenimenteSiStiri.hideMenu();
			certificari.hideMenu();
		});
		
		evenimenteSiStiri.getNode().click(function(){
			magazineleArc.hideMenu();
			evenimenteSiStiri.playMenu();
			certificari.hideMenu();
		});

		certificari.getNode().click(function(){
			magazineleArc.hideMenu();
			evenimenteSiStiri.hideMenu();
			certificari.playMenu();
		});
		
		parteneri.getNode().click(function() {
			parteneri.playMenu();
		});
	};
	
	function subMeniu(page, id) {
		var page	= page;
		var node 	= $("#" + id);
		var list 	= $("#" + id + " > ul");
		var link 	= $("#" + id + " > a");
		var stare 	= 'inactiv';
		
		this.getNode = function() { return node; }; 
		
		this.init = function() {
			var activate = false;
			
			if ( page == 'evenimenteSiStiri' ) {
				activate = (xander.getParam('rootPage') == 'evenimente') || (xander.getParam('rootPage') == 'stiri');
			}
			else {
				activate = xander.getParam('rootPage') == page;
			}
			
			if ( activate ) {
				stare = 'activ';
			}
		};
		
		this.hideMenu = function() {
			if (stare == 'activ') {
				list.hide();
				link.removeClass('plus minus');
				link.addClass('plus');
				stare = 'inactiv';
			}
		};
		
		this.playMenu = function() {
			list.toggle('fast');
			link.toggleClass('plus minus');
			stare = 'activ';
		};
	};
};





/*-----------------------------------------------------------------------------------------*/
/**
 * Abonare si Dezabonare la newsletter
 */
XANDER.prototype.newsletter = function() {
	
	this.init = function() {
		var form = $("#formNewsletter");
		
		$("#fields > input").click(function() {
			$("#newsletterStatus").hide();
		});
		
		$("#abona").click(function(){
			var toAppend = 	'<input type="hidden" name="action[abonare-newsletter]" />';
			$('#fields').append(toAppend);
			form.submit();
		});
		
		$("#dezab").click(function(){
			var toAppend = 	'<input type="hidden" name="action[dezabonare-newsletter]" />';
			$('#fields').append(toAppend);
			form.submit();
		});
	};
};





/*-----------------------------------------------------------------------------------------*/
/**
 * slider pentru Cell-urile cu Ultima stire / Ultimul eveniment 
 */
(function($) {

	$.fn.jFlow = function(options) {
		var opts = $.extend({}, $.fn.jFlow.defaults, options);
		var jFS =  opts.slideWrapper;

		var cur = 0;
		var maxi = $(opts.slides).children().length;
		var noCount = maxi;

		// sliding function
		var slide = function (dur, i) {
			$(opts.slides).children().css({
				overflow:"hidden"
			});
			$(opts.slides + " iframe").hide().addClass("temp_hide");
			$(opts.slides).animate({
				marginLeft: "-" + (i * $(opts.slides).find(":first-child").width() + "px")}, 
				opts.duration*(dur),
				opts.easing,
				function(){					
					$(opts.slides).children().css({
						overflow:"hidden"
					});
					$(".temp_hide").show();
				}
			);
		};
		
		$(opts.slides).before('<div id="'+jFS.substring(1, jFS.length)+'"></div>').appendTo(jFS);
		
		$(opts.slides).find("div").each(function(){
			$(this).before('<div class="jFlowSlideContainer"></div>').appendTo($(this).prev());
		});
		
		var resize = function (x){
			$(jFS).css({
				position:"relative",
				width: opts.width,
				height: opts.height,
				overflow: "hidden"
			});
			//opts.slides or #mySlides container
			$(opts.slides).css({
				position:"relative",
				width: $(jFS).width()*noCount+"px",
				height: $(jFS).height()+"px",
				overflow: "none"
			});
			// jFlowSlideContainer
			$(opts.slides).children().css({
				position:"relative",
				width: $(jFS).width()+"px",
				height: $(jFS).height()+"px",
				"float":"left",
				overflow:"none"
			});
			
			$(opts.slides).css({
				marginLeft: "-" + (cur * $(opts.slides).find(":eq(0)").width() + "px")
			});
		};
		
		// sets initial size
		resize();

		// resets size
		$(window).resize(function(){
			resize();						  
		});
		
		$(opts.prev).click(function(){
			var link = $(opts.vezi+cur).attr('href');
			window.location = link;
		});

		$(opts.next).click(function(){
			if ($(opts.slides).is(":not(:animated)")) {
				var dur = 1;
				if (cur < maxi - 1)
					cur++;
				else {
					cur = 0;
					dur = maxi -1;
				}
				slide(dur, cur);
			}
		});
	};
	
	$.fn.jFlow.defaults = {
		controller: ".jFlowControl", // must be class, use . sign
		slideWrapper : "#jFlowSlide", // must be id, use # sign
		selectedWrapper: "jFlowSelected",  // just pure text, no sign
		easing: "swing",
		duration: 400,
		width: "100%",
		prev: ".jFlowPrev", // must be class, use . sign
		next: ".jFlowNext", // must be class, use . sign
		vezi: "''"
	};
	
})(jQuery);





/*-----------------------------------------------------------------------------------------*/
/**
 * Google map pe pagina Magazine
 */
XANDER.prototype.google_map = function(optiuniHarta) {
	
	var defaults		= {
			lat			: 45.708057,
			long		: 25.57634,
			nume		: xander.getParam('websiteName'),
			adresa		: ''
		};
	var optiuni			= $.extend({}, defaults, optiuniHarta);
	
	this.init = function() {
		
		var latLong 		= new google.maps.LatLng(optiuni.lat, 			optiuni.long);
		var latLongCenter 	= new google.maps.LatLng(optiuni.lat + 0.001, 	optiuni.long);
		
		var mapOptions	= {
			zoom: 16,
			center: latLongCenter,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		
		var map = new google.maps.Map(document.getElementById("hartaGoogle"), mapOptions);
		
		var marker = new google.maps.Marker({
			position: latLong,
			map: map,
			title: optiuni.adresa
		});
		
		var content = 	"<b>" + xander.getxmlPagina('mapNume') + "</b><br />" +
						optiuni.nume + "<br /><br />" +
						"<b>" + xander.getxmlPagina('mapAdresa') + "</b><br />"+
						optiuni.adresa;
		var infoWindow = new google.maps.InfoWindow({
				content: content,
				position: latLong
		});
		infoWindow.open(map);
	};
	
};





/*-----------------------------------------------------------------------------------------*/
/**
 * Calendar
 */ 
XANDER.prototype.calendar = function(optiuniCalendar) {
	/* luniCreate retine instantele de calendar existente. Lunile = [1 .. 12]*/
	var luniCreate	 	= new Array();
	var idContainer		= null;
	var lunaActiva		= null;
	var numeLuni 		= null;
	var numeZile 		= null;
	
	var defaults		= {
			id			: 'calendar', 		//ID-ul div-ului
			paginaAjax  : 'ajax/calendar'
		};
	var optiuni			= $.extend({}, defaults, optiuniCalendar);
	
	this.init = function() {
		
		idContainer = $('#' + optiuni.id);
		
		//nume implicite pentru Lunile anului
		numeLuni = xander.getParam('months');
		if ( numeLuni != null ) {
			for (var i=0; i<12; i++) { 
				numeLuni[i] = numeLuni[i].toLowerCase();
			}
		}
		else {
			numeLuni = new Array();
			for (var i=0; i<12; i++) { 
				numeLuni[i] = 'M'+(i+1);
			}
		}

		//nume implicite pentru Zilele saptamanii
		numeZile = xander.getParam('weekdays');
		if ( numeZile != null ) {
			for (var i=0; i<7; i++) {
				numeZile[i] = numeZile[i].substring(0,2);
			}
		}
		else {
			numeZile = new Array();
			for (var i=0; i<7; i++) {
				numeZile[i] = 'D'+(i+1);
			}
		}
		
		/* container pentru calendar */
		var tableCalendar =	'<table class="calendar">'+
								'<tbody>'+
									'<tr class="monthSelect">'+
										'<td><a id="calendar_prev'+'" '+
												'href="'+'#'+'">&#171;</a></td>'+
												
										'<td colspan="5" id="calendar_link"></td>'+
										
										'<td><a id="calendar_next'+'" '+
												'href="'+'#'+'">&#187;</a></td>'+
									'</tr>' +
								'</tbody>' +
							'</table>'+
							'<div id="calendar_content"></div>';
		$(idContainer).html(tableCalendar);

		var anulCurent = xander.getParam('evThisYear');
		var lunaCurenta = xander.getParam('evThisMonth');
		
		/* trebuie sa le las asa si sa nu fac ca mai jos deoarece afisez luna DOAR dupa ce e gata apelul Ajax (care poate dura ...)
		 * "nu stie" de luniCreate[] daca fac ca in cazul general*/
		var url = xander.getParam('root') + '/' + optiuni.paginaAjax + '?an=' + anulCurent + '&luna=' + lunaCurenta;
		$.get(
			url,
			function(xmlResult){
				var data = extractDays(xmlResult);
				
				var an = xander.getParam('evThisYear');
				var luna = xander.getParam('evThisMonth');
				
				var lunaCurenta = new lunaCalendar(an, luna, data);
				lunaCurenta.genereaza();
				
				var rezLuna = lunaCurenta.getRezultat();
				if ( rezLuna != null ) {
					lunaActiva = lunaCurenta;
					marcheazaLuna(an, luna, lunaActiva);
					afiseazaCalendar();
				}
			}
		);
		
		//genereaza luna anterioara
		
		var luna = (lunaCurenta == 1) ? 12 : (lunaCurenta - 1); 
		var an = (lunaCurenta == 1) ? (anulCurent - 1) : anulCurent;
		genereazaLunaNoua(an, luna);
		
		//genereaza luna urmatoare
		luna = (lunaCurenta == 12) ? 1 : (lunaCurenta + 1);
		an = (lunaCurenta == 12) ? (anulCurent + 1) : anulCurent;
		genereazaLunaNoua(an, luna);
		
		$('#calendar_prev').click(function() {
			var anLuna = lunaActiva.afla_luna_vecina('prev');
			
			if (luniCreate[ anLuna['an'] + '-' + anLuna['luna'] ] != null) {
				lunaActiva = luniCreate[ anLuna['an'] + '-' + anLuna['luna'] ];
				afiseazaCalendar();
	
				anLuna = lunaActiva.afla_luna_vecina('prev');
				genereazaLunaNoua(anLuna['an'], anLuna['luna']);
			}
		});
		
		$('#calendar_next').click(function() {
			var anLuna = lunaActiva.afla_luna_vecina('next');
			
			if (luniCreate[ anLuna['an'] + '-' + anLuna['luna'] ] != null) {
				lunaActiva = luniCreate[ anLuna['an'] + '-' + anLuna['luna'] ];
				afiseazaCalendar();
	
				anLuna = lunaActiva.afla_luna_vecina('next');
				genereazaLunaNoua(anLuna['an'], anLuna['luna']);
			}
		});
	};
	
	/**
	 * salveaza intr-un array toate lunile create. pentru utilizare rapida
	 */
	function marcheazaLuna(an, luna, lunaGenerata) {
		if ( luniCreate[an + '-' + luna] == null ) {
			luniCreate[an+'-'+luna] = lunaGenerata;
		}
	};
	
	/**
	 * creaza o noua luna pentru calendar
	 * @param an
	 * @param luna = [1 .. 12]
	 * @param data = '[x, y, z]' - zilele care vor fi evidentiate
	 */
	function genereazaLunaNoua(an, luna) {
		if (luniCreate[an + '-' + luna] == null) {
			var url = xander.getParam('root') + '/' + optiuni.paginaAjax + '?an=' + an + '&luna=' + luna;
			
			$.get(
				url,
				function(xmlResult){
					var data = extractDays(xmlResult);
					
					var lunaCurenta = new lunaCalendar(an, luna, data);
					lunaCurenta.genereaza();
					
					var rezLuna = lunaCurenta.getRezultat();
					if ( rezLuna != null ) {
						marcheazaLuna(an, luna, lunaCurenta);
					}
				}
			);
		}
	};
	
	/**
	 * afiseaza calendarul in functie de @lunaActiva !!!! asigurati-va ca o setati inainte de a butona
	 */
	function afiseazaCalendar() {
		$('#calendar_link').html(lunaActiva.getLinkText());
		$('#calendar_content').html(lunaActiva.getRezultat());
	};

	/**
	 * extrage zilele din rezultatul Ajax
	 */
	function extractDays(xmlResult) {
		var data = new Array();
		$(xmlResult).find('zi').each(function(index){
			data[index] = $(this).text();
		});
		
		return data;
	};
	
	/**
	 * Obiect lunaCalendar folosit pentru generare de luna si altele
	 * 
	 * @param an				= anul dorit
	 * @param luna				= luna dorita
	 * @param zileEvenimente 	= zile cu Evenimente active (publicate)
	 */
	function lunaCalendar(an, luna, zileEvenimente) {
		an 		= parseInt(an);
		luna 	= parseInt(luna);
		var rezultat	= null;
		var linkText	= null;
		
		this.getRezultat = function() { return rezultat; };
		this.getLinkText = function() { return linkText; };
		
		
		/**
		 * rezolva problema capetelor de an
		 * @param directia = 'prev' sau 'next'
		 * @returns {Array} = ['an' => 2010, 'luna' => 12]
		 */
		this.afla_luna_vecina = function(directia) {
			var _luna = 0;
			var _an = 0;
			
			if (directia == 'prev') {
				_luna 	= (luna == 1) 	? 12 		: luna - 1; 
				_an 	= (luna == 1) 	? an - 1 	: an;
			}
			else if (directia = 'next') {
				_luna 	= (luna == 12) 	? 1 		: luna + 1;
				_an 	= (luna == 12) 	? an + 1 	: an;
			}
			
			return { luna : _luna, an : _an};
		};
		
		/**
		 * genereaza un nou <table> cu luna curenta
		 */
		this.genereaza = function() {
			
			var table = '<table class="calendar"><tr class="shortdays">';
			for (var i=0; i<7; i++) {
				table += '<td class="shortday">' + numeZile[i] + '</td>';
			}	
			table += '</tr>';
			
			var firstDayDate = new Date(an,luna-1,0);
			var firstDay	 = firstDayDate.getDay();
			var lastDay = firstDay + getDaysInMonth(luna-1,an);
			var end = ( lastDay > 35 ) ? 42 : 35;
			
			for (var i=0; i<end; i++ ) {
				
				if ( i < firstDay ) {
					table += ('<td class="zileAltaLuna">&#160;</td>');
				}
				else if ( i >= lastDay ) {
					table += ('<td class="zileAltaLuna">&#160;</td>');			 
				}
				else {
					var currentDay = i - firstDay + 1;
						
					table += ('<td class="zile' + currentDay + '">');
					
					if ( in_array(currentDay, zileEvenimente) ) {
						table += 	'<a href="' + xander.getxmlPagina('calendarLink') + 
										'?an=' + an +
										'&luna=' + luna +
										'&zi=' + currentDay + '">'+
										currentDay +
									'</a>';
					}
					else {
						table += currentDay;
					}
					
					table += ('</td>');
				}
				
				if ( i % 7 == 6) {
					table += ('</tr>');
				}
			}
			
			table +=	'<tr>'+
            				'<td colspan="7">' +
            					'<a href="'+ xander.getParam('calendarLink') +
		    							'?an=' + xander.getParam('thisYear') +
		    							'&luna=' + xander.getParam('thisMonth') +
		    							'&zi=' + xander.getParam('thisDay') + '"'+
            						'class="today">'+
            						 xander.getxmlPagina('azi') +
            					'</a>'+
            				'</td>'+
            			'</tr>'+
            		'</table>';
		
			linkText = '<a href="' + xander.getParam('calendarLink') +
							'?an=' + an +
							'&luna=' + luna +
						'">'+numeLuni[luna-1]+' '+an+'</a>';
			
			rezultat = table;
		};
		
		/**
		 * returneaza numarul de zile din luna
		 * 
		 * @param luna
		 * @param an
		 */
		function getDaysInMonth(luna,an) {
			var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
			
			if ( (luna == 1) && (an % 4 == 0) ) {
			  return 29;
			}
			else {
			  return daysInMonth[luna];
			}
		};
	};
};
