// section control
var SectionHandler = Class.create({
	sectionClass:"section",
	activeSectionClass:"section active",
	sectionIDPrefix:"section",
	selectorElement:false,
	sections:false,
	maxSectionDisplay:10,
	errorPages:new Array(),
	errorClass:'paginaErro',
	initialize:function() {
		
	},
	loadSelector:function(selectorName) {
		this.selectorElement = $(selectorName);
		this.sections = $$('div[class~="'+this.sectionClass+'"]');
		this.updateSelector(1);
	},
	getErrorClassIfNeeded:function(num) {
		for (var i=0;i<this.errorPages.length;i++) {
			if (this.errorPages[i] == num) return ' '+this.errorClass;
		}
		return '';
	},
	resetErrors:function() {
		this.errorPages = new Array();
	},
	addError:function(el) {
		var parent = el.parentNode;
		while (parent.className != this.activeSectionClass && parent.className != this.sectionClass) {
			try { parent = parent.parentNode; } catch(ex) {};
			if (!parent) return;
		}
		var num = parseInt(parent.id.replace(this.sectionClass,'').replace(this.activeSectionClass,''));
		this.errorPages.push(num);
	},
	updateSelector:function(num) {
		if (!num && num!=0) {
			// procurar secção activa
			try {
				num = parseInt($$('div[class="'+this.activeSectionClass+'"]')[0].id.replace(this.sectionIDPrefix,''));
				if (num<=-1) { num==1; }
			} catch(ex) {
				num = 1;
			}
		}
		var textElement = document.createElement('span');
		textElement.className = 'paginasTexto';
		textElement.innerHTML = "Ver P&aacute;gina:";
		this.selectorElement.innerHTML = "";
		this.selectorElement.appendChild(textElement);
		var sectionsBA = Math.floor(this.maxSectionDisplay/2);
		var startSection = Math.max(1,num-sectionsBA);
		var endSection = Math.min(startSection+sectionsBA,this.sections.length);
		for (var i=startSection;i<=endSection;i++) {
			var currentPage = document.createElement('a');
			currentPage.className = (i==num)?'paginaSel':('pagina' + this.getErrorClassIfNeeded(i)); // a página seleccionada já é visivel, não é necessário assinalar que tem erros
			currentPage.setAttribute('href','javascript:;');

			currentPage.setAttribute('onClick','sections.setSection('+i+')');
			currentPage.onClick = 'sections.setSection('+i+')';

			currentPage.innerHTML = i;

			this.selectorElement.appendChild(currentPage);
		}
	},
	setSection:function(num) {
		if (!num && num !== 0) return;
		var elements = this.sections;
		for (var i=0;i<elements.length;i++) {
			elements[i].className = (elements[i].id==this.sectionIDPrefix+num) ? this.activeSectionClass : this.sectionClass;
		}
		window.scrollTo(0,0);
		this.updateSelector(num);
	}
});
var sections = new SectionHandler();
// array.hasObject
//Array.prototype.hasObject = (!Array.indexOf ? function (o) {  var l = this.length + 1;  while (l -= 1)  { if (this[l - 1] === o) { return true; } } return false; } : function (o) {  return (this.indexOf(o) !== -1); });
// graficos para classificações por escala
var Ratings = Class.create({
	initialize: function() {
	
	},
	genGfx: function(prefix,id,escala,printVersion) {
		var toWrite="";
		for (var i=0;i<escala;i++) {
			if (!printVersion) {
				toWrite += "<img alt=\"\" class=\"escgfx\" id=\""+("i"+prefix+""+id+""+i)+"\" src='global/imgs/escala-estrela.png' "+this.getEvents(id,i,prefix,escala)+" />";
			} else {
				toWrite += "<img alt=\"\" class=\"escgfx\" id=\""+("i"+prefix+""+id+""+i)+"\" src='global/imgs/escala-estrela.png' />";
			}
		}
		$(prefix+""+id).innerHTML = toWrite;
	},
	getEvents: function(id,i,pre,esc) {
		var ev="onclick=\"classificacoes.setRating('"+id+"','"+(i+1)+"')\" " +
		"onmouseover=\"classificacoes.setHover('"+pre+"','"+i+"','"+esc+"','"+id+"')\"" +
		"onmouseout=\"classificacoes.unsetHover('"+pre+"','"+id+"','"+esc+"')\"";
		return ev;
	},
	setHover: function(pre,i,esc,id) {
		for (var z=0;z<esc;z++) {
			try {
				var im = $('i'+pre+""+id+""+z);
				im.src = "global/imgs/escala-estrela"+((z<=i)?"Hover":"")+".png";
			} catch(e) {};
		}
	},
	unsetHover: function(pre,id,esc) {
		try { var isset=$('EGr'+id); } catch(e) { var isset=false; };
		this.setHover(pre,((isset!==false)?(isset.value-1):0),esc,id);
	},
	setRating: function(id,r) {
		try { $('EGr'+id).value=r; } catch(e) {};
	}
});

// identico ao usado nos scos
var TableUtils = Class.create({
	initialize: function() {
	
	},
	selectRow: function (i) {
		try { var f=$("TD_"+i); } catch(e){};
		try { var b=$("USR_"+i); } catch(e){};
		if (b) { b.checked = !b.checked; }
		if (f) {
			var cname=this.returnClass(i)+((b.checked)?" selected":"");
			if ((utils.ff) || (utils.opera)) f.className=cname;
			else {
				f.className=cname;
				f.origClassName=cname; //ie para nao entrar em conflito com o hover.htc
			}
		}
	},
	selectRows: function(tb,param) {
		var t=$(tb).rows.length-1;
		for (var i=1;i<t;i++) {
			var x=$('USR_'+i);
			if (x) x.checked = (param=='all')?false:true;
			this.selectRow(i);
		}
	},
	returnClass: function(i) {
		return (i%2==0)?"tra":"trb";
	}
});
// controlo de blocos (divs)
var BlockContainer = Class.create({
	initialize: function() {
	},
	showOnly: function(cid,bid,obj) {
		if ((!cid) || (!bid)) return;
		var con = $(cid);
		if (!con) return;
		var len = con.childNodes.length;
		for (var x=0;x<len;x++) {
			if (con.childNodes[x].getAttribute && con.childNodes[x].getAttribute("id") == bid) {
				con.childNodes[x].style.display = "block";
			} else {
				try { con.childNodes[x].style.display = "none"; } catch(ex) {};
			}
		}
		if (obj) {
			var tb = obj.parentNode;
			var len2 = tb.childNodes.length;
			for (var i=0;i<len2;i++) {
				try { tb.childNodes[i].style.background = ""; } catch(ex) {};
			}
			obj.style.background="#D9F2DB";
		}
	},
	show: function(bid) {
		if (!bid) return;
		var con = $(bid);
		if (con) con.style.display = "block";
	},
	hide: function(bid) {
		if (!bid) return;
		var con = $(bid);
		if (con) con.style.display = "none";
	},
	hideOnly: function(cid,bid) {
		if ((!cid) || (!bid)) return;
		var con = $(cid);
		if (!con) return;
		var len = con.childNodes.length;
		for (x=0;x<len;x++) {
			if (con.childNodes[x].getAttribute("id") == bid) {
				con.childNodes[x].style.display = "none";
			} else {
				con.childNodes[x].style.display = "block";
			}
		}
	},
	showAll: function(cid) {
		if (!cid) return;
		var con = $(cid);
		if (!con) return;
		var len = con.childNodes.length;
		for (x=0;x<len;x++) {
			try {con.childNodes[x].style.display = "block"; } catch(ex) {};
		}
	},
	hideAll: function(cid) {
		if (!cid) return;
		var con = $(cid);
		if (!con) return;
		var len = con.childNodes.length;
		for (x=0;x<len;x++) {
			try { con.childNodes[x].style.display = "none"; } catch(ex) {};
		}
	}
});
// Utils
var Utils = Class.create({
	initialize: function() {
		this.ff=(navigator.userAgent.indexOf("Firefox")!=-1)?true:false; // firefox?
		this.opera=(navigator.userAgent.indexOf("Opera")!=-1)?true:false; // opera?
	},
	_isChecked: function (obj) {
		return obj.checked;
	},
	createCookie: function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		} else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	readCookie: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	isEmpty: function (s) {
		if ((!s) || (s == "undefined")) return true;
		else if (s.replace(" ","") == "") return true;
		return false;
	},
	ask: function (str) {
		return confirm(str);
	},
	charsAreValid: function (str) {
		var badchars = /[\(\)\<\>\,\;\:\\\/\"\[\]]/;
		return !str.match(badchars);
	},
	htmlentities: function(s) {
		var d = document.createElement('div'),t = document.createTextNode(s);
		d.appendChild(t); return d.innerHTML;
	},
	isMail: function (mail) {
		
		var formato = /^.+@.+\..{2,3}$/;
		if ((!(formato.test(mail))) || (!this.charsAreValid(mail)))
			return false;
		else
			return true;
	},
	isInteger: function (s) {
		var i;
	    for (i = 0; i < s.length; i++){   
	        // Check that current character is number.
	        var c = s.charAt(i);
	        if (((c < "0") || (c > "9"))) return false;
	    }
	    // All characters are numbers.
	    return true;
	},
	stripCharsInBag: function (s, bag) {
		var i;
	    var returnString = "";
	    // Search through string's characters one by one.
	    // If character is not in bag, append to returnString.
	    for (i = 0; i < s.length; i++){   
	        var c = s.charAt(i);
	        if (bag.indexOf(c) == -1) returnString += c;
	    }
	    return returnString;
	},
	daysInFebruary: function (year) {
	    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
	},
	DaysArray: function (n) {
		for (var i = 1; i <= n; i++) {
			this[i] = 31;
			if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;}
			if (i==2) {this[i] = 29;}
	   } 
	   return this
	},
	isDate: function (dtStr,dtCh,minYear,maxYear) {
	
	// Devolve true ou false

	// dtStr = Data (formato: dd-mm-aaaa)
	// dtCh = Caracter de separação (no formato acima, seria: - )
	// minYear = Ano minimo
	// maxYear = Ano máximo

	// ex: var x = isDate("21-02-2008","-","2000","2010"); // output-> x =  true;
		var daysInMonth = DaysArray(12);
		var pos1=dtStr.indexOf(dtCh);
		var pos2=dtStr.indexOf(dtCh,pos1+1);
		// dia trocado com mes, para ficar no nosso formato.
		var strDay=dtStr.substring(0,pos1);
		var strMonth=dtStr.substring(pos1+1,pos2);
		var strYear=dtStr.substring(pos2+1);
		strYr=strYear;
		if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
		if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
		for (var i = 1; i <= 3; i++) {
			if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);
		}
		month=parseInt(strMonth);
		day=parseInt(strDay);
		year=parseInt(strYr);
		if (pos1==-1 || pos2==-1){
			alert("O formato da data tem de ser: dd-mm-aaaa (ex: 14-02-2007)");
			return false;
		}
		if (strMonth.length<1 || month<1 || month>12){
			alert("Mes incorrecto");
			return false;
		}
		if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
			alert("Dia incorrecto");
			return false;
		}
		if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
			alert("O ano tem de ter 4 digitos entre "+minYear+" e "+maxYear);
			return false;
		}
		if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
			alert("Data incorrecta");
			return false;
		}
	return true;
	}
});

// GLOBAL OBJECTS
utils = new Utils();
block = new BlockContainer();
rows = new TableUtils();
classificacoes = new Ratings();
//
