﻿/* 20101031-1830 */
if (!window.jQuery) {
	throw new Error('TemplatingError » O objeto "jQuery" não foi encontrado. Por favor, verifique se o include correspondente foi realizado.');
}
if (!window.modMan) {
	throw new Error('TemplatingError » O objeto "modMan" não foi encontrado. Por favor, verifique se o include correspondente foi realizado.');
}

modMan.namespaces.create('elections2010', function($, CONTEXT_DATA, TOOLS) {

	var ELECTIONS_2010 = this.editorialSettings = {
		year:'2010',
		turn:window.trrContextData ? window.trrContextData.turn : "1",
		stage:window.trrContextData ? window.trrContextData.stage : "counting",
		type:window.trrContextData ? window.trrContextData.type : "home",
		secondTurnStartDate:new Date(2010, 9, 31, 0, 0)
	};
	var DSV = false;

	
	TOOLS.log.checkpoint('Criando classe "Controller"');

	var Controller = this.Controller = (function(){
		var services = {},
			wsBaseUrl = "http://p1.trrsf.com.br/contentAPI/elections/",
			globalReloadInterval = ELECTIONS_2010.stage == 'results' ?  0 : 10,
			STATUS_READY = 'ready',
			STATUS_LOADING = 'loading',
			STATUS_ACTIVE = 'active';

		return {
			setWsBaseUrl:function(newPath){
				if(!newPath || !newPath.match){
					throw new TypeError("O método 'setWsBaseUrl()' deve receber, como primeiro parâmetro, uma string que represente o endereço base par ao WS. Valor atual: "+newPath + " ("+typeof(newPath)+")");
				}

				wsBaseUrl = newPath;

				if (wsBaseUrl.match(/hlg-/)) {
					DSV = true;
				}

			},
			getWsBaseUrl:function(){
				return wsBaseUrl;
			},
			setGlobalReloadInterval:function(reloadIntervalInSeconds) {
				if(typeof reloadIntervalInSeconds != 'number') {
					throw new ReferenceError("O método 'setGlobalReloadInterval()' deve receber, como primeiro parâmetro, um número que represente o intervalo de tempo desajado para as requisições ao WS. Valor atual: "+reloadIntervalInSeconds + " ("+typeof(reloadIntervalInSeconds)+")");
				}

				globalReloadInterval = reloadIntervalInSeconds;
			},
			getGlobalReloadInterval:function() {
				return globalReloadInterval;
			},
			forceReload:function() {
				for(var serviceId in services) {
					if(services[serviceId].status == STATUS_ACTIVE) {
						services[serviceId].reload();
					} else if (services[serviceId].status == STATUS_LOADING) {
						TOOLS.log.warning('A requisição para o serviço ' + serviceId + ' já estava em andamento. Não foi necessário forçar o reload.');
					}
				};
			},
			services:function(){
				var timers = {};

				var request = function(){ // this = ServiceInstance
						var ServiceInstance = this;
							ServiceInstance.status = STATUS_LOADING,
							params = ServiceInstance.wsOptions,
							baseURL = (DSV) ? Controller.getWsBaseUrl() : Controller.getWsBaseUrl() + ServiceInstance.serviceMethodName;
							
						if (!DSV) {
							params = $.extend({}, params);
							delete params.srv;
						}

						TOOLS.jsonP({
							url:TOOLS.mountQueryStringUrl(baseURL, params),
							cache:true,
							overwriteData:true,
							wrapperName:ServiceInstance.wsOptions.callback,
							callback:function(json) {
								TOOLS.log.checkpoint('Disparando callback de '+ ServiceInstance.id);
								ServiceInstance.status  = STATUS_ACTIVE;

								//json = json.eleicoes || json;
								if (typeof json != 'object' || json.error) {
									var errorMsg = ' <strong>Não foi possível localizar o objeto "data" na resposta do serviço '+ServiceInstance.id+'</strong>';
									if (json && json.error) {
										errorMsg += ' '+json.message + ' - ' + json.dt_proc;
									}
									if (ServiceInstance.errorHandler) {
										ServiceInstance.errorHandler.call(ServiceInstance, errorMsg);										
										return ServiceInstance;
									} else {
										throw new Error(errorMsg);
									}
								}

								//alert(ServiceInstance.id + '\n\n'+ TOOLS.mountQueryStringUrl(Controller.getWsBaseUrl(), ServiceInstance.wsOptions) + '\n\n'+ data.toSource());

								if (ServiceInstance.reloadInterval && json.MAXAGE && json.MAXAGE != ServiceInstance.reloadInterval) {
									TOOLS.log.warning('Sincronizando serviço '+ ServiceInstance.id + ' com servidor. O interfavlo entre as requisições foi alterado de '+ServiceInstance.reloadInterval+'s para ' + json.MAXAGE + 's.');
									ServiceInstance.reloadInterval = json.MAXAGE;

									if (timers[ServiceInstance.id]) {
										timers[ServiceInstance.id] = clearInterval(timers[ServiceInstance.id]);
									}

									timers[ServiceInstance.id] = setInterval(function() {

										request.call(ServiceInstance);
									}, ServiceInstance.reloadInterval * 1000);
								} else if (!ServiceInstance.reloadInterval) {
									ServiceInstance.status = STATUS_READY;
								}

								update.call(ServiceInstance, json.data || null, json.LASTUPDATE);
							}
						});
					},
					update = function(data, lastUpdate) { // this = ServiceInstance
						this.requests++;

						var hasNewData;
						if (!lastUpdate || !this.lastUpdate || lastUpdate != this.lastUpdate) {
							this.updates++;
							this.lastUpdate = lastUpdate;
							hasNewData = true;
						} else {
							hasNewData = false;
						}

						var requestDetails = {
							requestNumber:this.requests,
							updateNumber:this.updates,
							hasNewData:hasNewData
						};

						TOOLS.log.checkpoint('Tem dados? <strong>' + (!!data) + ' </strong>');
						TOOLS.log.checkpoint('Atualizados? <strong>' + hasNewData + ' </strong>');						
						
						TOOLS.log.checkpoint('Disparando procedures para ' + this.id);
						for(var i = 0, currentProcedure; currentProcedure = this.procedures[i]; i++) {
							try {
								currentProcedure.call(this, data, requestDetails);
							} catch (e) {
								e.message = 'Erro ao executar procedure ' + (i+1) + ' do serviço '+this.id+' » ' + e.message;
								TOOLS.log.critical(e);
							}
						};

					};

				return {
					create:function(serviceId, optionsDetails){
						if(!(this instanceof Controller.services.create)) {
							return new Controller.services.create(serviceId, optionsDetails);
						}
						var SELF = services[serviceId] = this;

						var validateWsOptions = function(wsOptions) {
							// validate wsOptions struct
							var structErrors = TOOLS.getStructErrors({
								data:wsOptions,
								model:SELF.optionsStruct
							});
							if (structErrors) {
								throw new TypeError('Erro na validação de opções para o serviço '+serviceId+' - '+structErrors + '\n' + structErrors);
							}
							TOOLS.log.checkpoint('Opções corretamente configuradas para o serviço ' + SELF.id);

							SELF.wsOptions = wsOptions;
							SELF.options = $.extend({}, wsOptions);

							return SELF;
						};

						this.id = serviceId;
						this.status = STATUS_READY;
						this.optionsStruct = optionsDetails.struct;
						this.defaultValues = optionsDetails.defaultValues;
						this.wsOptions;
						this.options;
						this.procedures = [];
						this.requests = 0;
						this.updates = 0;
						this.lastUpdate;


						this.setOptions = validateWsOptions;

						this.setCrossReferenceBridge = function(optionsHandler){
							if (typeof optionsHandler != 'function') {
								throw new TypeError("O método 'setCrossReferenceBridge()' deve receber, como primeiro parâmetro, uma função capaz de retornar um objeto compatível com os parâmetros originais do serviço.");
							}

							SELF.setOptions = function(userOptions) {
								try {
									if (SELF.options) {
										userOptions = $.extend(SELF.options, userOptions || {});
									}
									
									SELF.lastUpdate = null;
									
									optionsHandler.call(SELF, userOptions, function(wsOptions){
										validateWsOptions(wsOptions);

										SELF.options = userOptions;
									});
								} catch(e) {
									e.message = 'Erro encontrado ao validar opções para o serviço '+SELF.id + ' >> ' + e.message;
									TOOLS.log.critical(e);
								} finally {
									return SELF;
								}
							};

							return SELF;
						};

						this.setProcedure = function(dataHandler){
							if(typeof dataHandler != "function") {
								throw new TypeError("O método 'setOnLoadProcedure()' deve receber uma função como primeiro parâmetro");
							}

							SELF.procedures.push(dataHandler);

							return SELF;
						};

						this.unsetProcedures = function(){
							SELF.procedures = [];

							return SELF;
						};

						this.setErrorHandler = function(customHandler){
							if (typeof customHandler != "function") {
								throw new TypeError("O método 'setErrorHandler()' deve receber uma função como primeiro parâmetro");
							}
							
							if (SELF.errorHandler) {
								TOOLS.log.warning('O serviço '+SELF.id+' já havia recebido uma função para tratamento de erros. O método foi substituído.');
							}
							
							SELF.errorHandler = customHandler;

							return SELF;
						};

						this.start = function(voidFirstInterval){
							try {

								if (!SELF.wsOptions){
									throw 'Não é possível iniciar o serviço '+SELF.id+' (chamada ao método "start()") sem configurar seus parâmetros. Para tanto, utilize o método "setOptions()".';
								}
								if (!SELF.procedures.length){
									throw 'Nenhuma função de callback foi associada ao serviço '+SELF.id+'. Para atribuí-la, utilize o método "setProcedure()".';
								}

								SELF.serviceMethodName = SELF.serviceMethodName || SELF.wsOptions.srv;
								SELF.status = STATUS_ACTIVE;

								if (SELF.reloadInterval === undefined) {
									SELF.reloadInterval = globalReloadInterval || 0;
								}

								if (voidFirstInterval || !SELF.reloadInterval) {
									request.call(SELF);
								} else {
									timers[SELF.id] = setInterval(function(){
										request.call(SELF);
									}, SELF.reloadInterval * 1000);
								}
							} catch(e) {
								if (e.match) {
									TOOLS.log.critical(new Error(e));
								} else {
									TOOLS.log.critical(e);
								}
							} finally {
								return SELF;
							}

						};

						this.stop = function() {
							if(timers[SELF.id]) {
								timers[SELF.id] = clearInterval(timers[SELF.id]);
								TOOLS.log.checkpoint('Interrompendo serviço: '+SELF.id);
							}
							SELF.status = STATUS_READY;
						};

						this.reload = function() {
							if (SELF.reloadInterval) {
								if (SELF.status == STATUS_ACTIVE) {
									TOOLS.log.warning('Forçando reload do serviço ' + SELF.id);
									if (timers[SELF.id]) {
										timers[SELF.id] = clearInterval(timers[SELF.id]);
									}

									timers[SELF.id] = setInterval(function(){
										request.call(SELF);
									}, SELF.reloadInterval * 1000);

									request.call(SELF);
								} else if (SELF.status == STATUS_LOADING) {
									TOOLS.log.warning('O reload do serviço não foi forçado porque já existe uma requisição em andamento.');
								} else {
									TOOLS.log.critical('O serviço ' + SELF.id + ' está disponível mas não foi iniciado. Utilize o método "start()" para iniciá-lo.');
								}
							} else {
								TOOLS.log.critical('O serviço ' + SELF.id + ' não está configurado para realizar reload automático. Utilize o método "start()" para iniciá-lo.');
							}
						};

						this.setReloadInterval = function(reloadIntervalInSeconds) {
							try {
								if(typeof reloadIntervalInSeconds != 'number') {
									throw new "O método 'setGlobalReloadInterval()' deve receber, como primeiro parâmetro, um número que represente o intervalo de tempo desajado para as requisições ao WS. Valor atual: "+reloadIntervalInSeconds + " ("+typeof(reloadIntervalInSeconds)+")";
								}

								SELF.reloadInterval = reloadIntervalInSeconds;
							} catch(e) {
								if(e.match) {
									TOOLS.log.critical(new Error(e));
								} else {
									TOOLS.log.critical(e);
								}
							} finally {
								return SELF;
							}
						};

						this.getReloadInterval = function(){
							return SELF.reloadInterval || globalReloadInterval;
						};

						TOOLS.log.checkpoint('Serviço cadastrado: '+serviceId);

						return this;

					},
					get:function(serviceId){
						if(!serviceId || !serviceId.match || !services[serviceId]) {
							throw new ReferenceError('Serviço não encontrado » O método "services.get()" deve receber uma string que represente o identificador do servico desejado. Valor informado: '+serviceId + " ("+typeof(serviceId)+")");
						}
						TOOLS.log.checkpoint('Acionando serviço '+ serviceId);
						return services[serviceId];
					},
					list:function(){
						var list = [];
						for(var serviceId in services) {
							list.push(serviceId);
						};

						return list;
					}
				}
			}()
		};
	})();



	TOOLS.log.checkpoint('Criando classe de apoio "CrossReference"');

	var CrossReference = this.CrossReference = function (){

		var memory = {
				regions:{
					0:{ name:"todas", label:"Todas" },
					1:{ name:"regiao-sudeste", label:"Sudeste" },
					2:{ name:"regiao-sul", label:"Sul" },
					3:{ name:"regiao-nordeste", label:"Nordeste" },
					4:{ name:"regiao-centro-oeste", label:"Centro-Oeste" },
					5:{ name:"regiao-norte", label:"Norte" }
				},
				states:{
					1:{ name:"todos", label:"Brasil (todos)", regionName:"todas", abbr: "BR" },
					2:{ name:"acre", label:"Acre", regionName:"regiao-norte", abbr: "AC" },
					3:{ name:"alagoas", label:"Alagoas", regionName:"regiao-nordeste", abbr: "AL"  },
					4:{ name:"amapa", label:"Amapá", regionName:"regiao-norte", abbr: "AP"  },
					5:{ name:"amazonas", label:"Amazonas", regionName:"regiao-norte", abbr: "AM"  },
					6:{ name:"bahia", label:"Bahia", regionName:"regiao-nordeste", abbr: "BA"  },
					7:{ name:"ceara", label:"Ceará", regionName:"regiao-nordeste", abbr: "CE"  },
					8:{ name:"distrito-federal", label:"Distrito Federal", regionName:"regiao-centro-oeste", abbr: "DF"  },
					9:{ name:"espirito-santo", label:"Espírito Santo", regionName:"regiao-sudeste", abbr: "ES" },
					10:{ name:"goias", label:"Goiás", regionName:"regiao-centro-oeste", abbr: "GO" },
					11:{ name:"maranhao", label:"Maranhão", regionName:"regiao-nordeste", abbr: "MA"  },
					12:{ name:"mato-grosso", label:"Mato Grosso", regionName:"regiao-centro-oeste", abbr: "MT"  },
					13:{ name:"mato-grosso-do-sul", label:"Mato Grosso do Sul", regionName:"regiao-centro-oeste", abbr: "MS" },
					14:{ name:"minas-gerais", label:"Minas Gerais", regionName:"regiao-sudeste", abbr: "MG" },
					15:{ name:"para", label:"Pará", regionName:"regiao-norte", abbr: "PA" },
					16:{ name:"paraiba", label:"Paraíba", regionName:"regiao-nordeste", abbr: "PB" },
					17:{ name:"parana", label:"Paraná", regionName:"regiao-sul", abbr: "PR" },
					18:{ name:"pernambuco", label:"Pernambuco", regionName:"regiao-nordeste", abbr: "PE" },
					19:{ name:"piaui", label:"Piauí", regionName:"regiao-nordeste", abbr: "PI" },
					20:{ name:"rio-de-janeiro", label:"Rio de Janeiro", regionName:"regiao-sudeste", abbr: "RJ" },
					21:{ name:"rio-grande-do-norte", label:"Rio Grande do Norte", regionName:"regiao-nordeste", abbr: "RN" },
					22:{ name:"rio-grande-do-sul", label:"Rio Grande do Sul", regionName:"regiao-sul", abbr: "RS" },
					23:{ name:"rondonia", label:"Rondônia", regionName:"regiao-norte", abbr: "RO" },
					24:{ name:"roraima", label:"Roraima", regionName:"regiao-norte", abbr: "RR" },
					25:{ name:"santa-catarina", label:"Santa Catarina", regionName:"regiao-sul", abbr: "SC" },
					26:{ name:"sao-paulo", label:"São Paulo", regionName:"regiao-sudeste", abbr: "SP" },
					27:{ name:"sergipe", label:"Sergipe", regionName:"regiao-nordeste", abbr: "SE" },
					28:{ name:"tocantins", label:"Tocantins", regionName:"regiao-norte", abbr: "TO" }
				},
				titles:{
					1:{ name:"presidente", label:"Presidente"},
					3:{ name:"governador", label:"Governador"},
					5:{ name:"senador", label:"Senador"},
					6:{ name:"deputado-federal", label:"Deputado Federal" },
					7:{ name:"deputado-estadual", label:"Deputado Estadual" },
					8:{ name:"deputado-distrital", label:"Deputado Distrital" }
				}
			},
			localStorage = (document.domain && window.localStorage && window.JSON && window.JSON.parse && window.JSON.stringify) ? window.localStorage : false;


		var getReference = function(type, callback){
			var cachedReference;

			if (memory[type]) {
				cachedReference = memory[type];
			} else if (localStorage && localStorage.getItem(type) && localStorage.getItem(type) != 'undefined') {
				TOOLS.log.checkpoint('Recuperando ' + type + ' from localStorage (evitando requisição).');
				cachedReference = memory[type] = JSON.parse(localStorage.getItem(type));
			}

			if (cachedReference){
				return cachedReference;
			} else {
				return null;
			}
		},
		setStateReference = function(ufName, data){
			memory[ufName] = data;

			if (localStorage) {
				localStorage.setItem(ufName, JSON.stringify(data));
			}
		}

		return {
			getStateDetails:function(){

				var request = function(params, callback){
					var serviceMethodName = params.srv,
						baseURL = (DSV) ? Controller.getWsBaseUrl() : Controller.getWsBaseUrl() + serviceMethodName;
						
					if (!DSV) {
						params = $.extend({}, params);
						delete params.srv;
					}

					TOOLS.jsonP({
						url:TOOLS.mountQueryStringUrl(baseURL, params),
						cache:true,
						overwriteData:true,
						wrapperName:params.callback,
						callback:function(data){
							callback(data);
						}
					});
				};

				return function(ufName, callback){
					if (ufName == 'todos') {
						throw new ReferenceError('Não é possível consultar todas cidades do país. Evite o uso do método getStateDetails() com parâmetro "todos".');
					}

					
					var idUf = CrossReference.search.idUf(ufName),
						stateReference = getReference(ufName);
					
					if (idUf == null) {
						throw new ReferenceError('Não foi possível localizar referência para o estado "'+ufName+' na base de dados."');
					}
					
					if (localStorage && !(stateReference instanceof Array)) {
						localStorage.removeItem(ufName);
						stateReference = null;
					}

					if (stateReference) {
						callback(stateReference);
					} else {

						request({
								prd:"elections",
								srv:"getListCitiesJSON",
								idRegion:'2',
								idUf:idUf,
								callback:"json_getStateDetails"
							}, function(json){
								TOOLS.log.checkpoint('Recebendo dados do sevidor para o estado '+ufName);
								if (typeof json.data == 'object') {
									if (!(json.data instanceof Array)) {
										json.data = [json.data];
									}
									setStateReference(ufName, json.data);
									callback(json.data);
								}
								else {
									TOOLS.log.critical('Erro ao localizar a lista de cidades no feed que represtando o estado  <strong>' + ufName + '</strong>.');
								}
							}
						);
					}
				}
			}(),
			search:function(){

				var fromPropertieToKey = function(propertieName, propertieValue, referenceObject){
						for (var key in referenceObject){
							if (referenceObject[key][propertieName] == propertieValue) {
								return key;
							}
						};
						return null;
					},
					fromKeyToPropertie = function(key, outputPropertieName, referenceObject){
						if (referenceObject[key] && referenceObject[key][outputPropertieName]) {
							return referenceObject[key][outputPropertieName];
						}
						return null;
					};

				return {
					regionName: function(idRegion){
						var reference = getReference('regions');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para regiões.');
						}

						var value = fromKeyToPropertie(idRegion, "name", reference);

						return value;
					},
					idRegion: function(regionName){
						var reference = getReference('regions');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para regiões.');
						}

						var value = fromPropertieToKey("name", regionName, reference);

						return value;
					},
					idRegionFromUfName: function(ufName){
						var reference = getReference('states');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para estados.');
						}

						var index = fromPropertieToKey("name", ufName, reference);
						if (index == null) {
							throw new ReferenceError('Não foi possível identificar a regiao para o estado "'+ufName+'".');
						}
						var value = CrossReference.search.idRegion(reference[index].regionName);

						return value;
					},
					titleName: function(idTitle){
						var reference = getReference('titles');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para regiões.');
						}

						var value = fromKeyToPropertie(idTitle, "name", reference);

						return value;
					},
					idTitle: function(titleName){
						var reference = getReference('titles');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para regiões.');
						}

						var value = fromPropertieToKey("name", titleName, reference);

						return value;
					},
					idUf: function(ufName){
						var reference = getReference('states');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para estados.');
						}

						var value = fromPropertieToKey("name", ufName, reference);

						return value;
					},
					ufName: function(idUf){
						var reference = getReference('states');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para estados.');
						}

						var value = fromKeyToPropertie(idUf, "name", reference);

						return value;
					},
					idCity: function(ufName, cityName){
						var reference = getReference(ufName);
						if(!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com o estado ' + ufName + '. Por favor, execute o método CrossReference.getStateDetails(), passando o nome do estado como primeiro parâmetro e a função que deve ser executada no callback no segundo (It sucks! I know...).');
						}
						var index = fromPropertieToKey("RAW_LABEL", cityName, reference);
						if (index == null) {
							throw new ReferenceError('Não foi possível localizar uma cidade com identificador "'+cityName+'" no estado "'+ufName+'"');
						}
						var value = reference[index].ID;

						return value;
					},
					cityName: function(ufName, idCity){
						var reference = getReference(ufName);
						if(!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com o estado ' + ufName + '. Por favor, execute o método CrossReference.getStateDetails(), passando o nome do estado como primeiro parâmetro e a função que deve ser executada no callback no segundo (It sucks! I know...).');
						}

						// coisar!
						var value = fromKeyToPropertie(idCity, "RAW_LABEL", reference);

						return value;
					},
					stateAbbr: function(ufName) {	
						var reference = getReference('states');
						if (!reference) {
							throw new Error('O CrossReference não está preparado para trabalhar com referências para estados.');
						}					
						
						var idUf = CrossReference.search.idUf(ufName);
						
						if(!idUf) {
							throw new Error('O CrossReference não está preparado para trabalhar com o estado ' + ufName + '.');
						}
						
						var abbr = fromKeyToPropertie(idUf, "abbr", reference);
						
						return abbr || null;
					}
				};
			}(),
			handler:function CrossReferenceHandler(reference){ // this = wsOptionsStruct
				if (typeof reference != 'object') {

				} else if (typeof reference.struct != 'object') {}

				return function(userOptions, callback){ // this = serviceInstance

					userOptions = $.extend({}, reference.defaultValues, userOptions);

					// validate local struct
					var structErrors = TOOLS.getStructErrors({
						data:userOptions,
						model:reference.struct
					});
					if (structErrors) {
						throw new TypeError(structErrors);
					}
					TOOLS.log.checkpoint('Opções do usuário > OK.')

					// convert
					var wsOptions = {},
						optionsStruct = this.optionsStruct;
					for(var propertie in this.optionsStruct) {
						if (userOptions[propertie] !== undefined) {
							wsOptions[propertie] = userOptions[propertie];
						} else if (CrossReference.search[propertie]){

							switch (propertie) {
								case 'idRegion':
									if(userOptions.regionName) {
										wsOptions[propertie] = CrossReference.search[propertie](userOptions.regionName);
									} else if(userOptions.ufName) {
										wsOptions[propertie] = CrossReference.search.idRegionFromUfName(userOptions.ufName);
									}
								break;

								case 'idUf':
									wsOptions[propertie] = CrossReference.search[propertie](userOptions.ufName) || undefined;
								break;

								case 'idTitle':
									wsOptions[propertie] = CrossReference.search[propertie](userOptions.titleName) || undefined;
								break;

								case 'idCity':
									if(!userOptions.cityName || userOptions.cityName == 'todas') {
										wsOptions[propertie] = '0';
									} else {
										wsOptions[propertie] = CrossReference.search[propertie](userOptions.ufName, userOptions.cityName);
									}
								break;
							}

						} 
					}
					wsOptions = $.extend(this.defaultValues || {}, wsOptions);
					// validate local struct
					var structErrors = TOOLS.getStructErrors({
						data:wsOptions,
						model:optionsStruct
					});
					if (structErrors) {
						throw new TypeError('O ws exige a presença de parâmetros que NÂO foram declarados ou localizados pelo CrossReference. >> '+structErrors);
					}
					callback(wsOptions);

					return wsOptions;
				};
			}
		}
	}();

	TOOLS.log.checkpoint('Criando classe "HashDealer"');
	var HashDealer = this.HashDealer = new function () {
		var SELF = this,
			HASH_PREFIX = "#",
			LEVEL_SPLITTER = "/",

			lastUpdatedUrl = location.href + '',
			handlers = {
				onChange:[]
			},
			validLevelsExp, currentLevels;


		var getLevels = function () {
			var EXP_SPLIT_LEVELS = /[^#\/]+/g;
			return function () {
				if (location.hash) {
					return location.hash.match(EXP_SPLIT_LEVELS);
				} else {
					return null;
				}
			};
		}();

		var triggerHandlers = function(type){
			for (var i = 0, currentHandler; currentHandler = handlers[type][i]; i++) {
				try {
					currentHandler.apply(currentLevels, currentLevels);
				} catch(e) {
					TOOLS.log.critical('Erro ao disparar função associada ao evento '+type+' da classe "HashDealer".');
				}
			}
		};

		var assertUrl = function (foundLevels, validLevelsExp) {
			var validLevels = [];
			for (var i = 0, current; current = foundLevels[i]; i++) {
				if (validLevelsExp[i] && validLevelsExp[i].test(current)) {
					validLevels.push(current);
				}
			}

			if (validLevels.length < foundLevels.length) {

				if (!validLevels.length) {
					location.replace(location.href.replace(/#.*$/,''));
				} else {
					var newHash = LEVEL_SPLITTER + validLevels.join(LEVEL_SPLITTER) + LEVEL_SPLITTER;
					location.replace(location.href.replace(location.hash, HASH_PREFIX + newHash));
				}

				return;
			}
		};

		// public >>
		this.lastUpdatedUrl = lastUpdatedUrl;
		this.validLevelsExp = validLevelsExp;
		this.currentLevels = getLevels();

		this.getLevels = function (callback) {
			if(typeof callback != 'function') {
				TOOLS.log.critical('O método "HashDealer.getLevels()" deve receber uma função como primeiro parâmetro');
				return SELF;
			}
			
			SELF.currentLevels = getLevels();

			callback.call(SELF.currentLevels, SELF.currentLevels || []);
			
			return SELF;			
		};

		this.setLevels = function (valuesArray) {
			if (!valuesArray || !valuesArray.length) {
				TOOLS.log.critical('O método "HashDealer.setLevels()" deve receber um Array de strings como primeiro parâmetro.');
				return SELF;
			}
			
			var newHash = LEVEL_SPLITTER + valuesArray.join(LEVEL_SPLITTER) + LEVEL_SPLITTER;
			//TOOLS.log('Configurando o hash como ' + newHash);
			SWFAddress.setValue(newHash);

			return SELF;
		};
		
		this.clearLevels = function () {
		//	TOOLS.log('Removendo configuração de hash.');
			SWFAddress.setValue('');

			return SELF;
		};

		this.setValidLevelsExp = function (levelsExpList) {
			if (typeof levelsExpList == 'object' && levelsExpList.length) {

				SELF.validLevelsExp = levelsExpList;

				var foundLevels = getLevels();
				if (foundLevels && SELF.validLevelsExp) {
					assertUrl(foundLevels, SELF.validLevelsExp);
				}
			} else {
				TOOLS.log.critical('O valor trasnmitido ao método ".HashDealer.setValidLevelsExp()" deve ser um array composto por expressões regulares que validem cada nívels de hash permitido.');
			}

			return SELF;
		};

		this.onChange = function (customHandler) {
			handlers.onChange.push(customHandler);

			return SELF;
		};

		// constructor >>
		window.setInterval(function () {
			if (lastUpdatedUrl != location.href) {
				var foundLevels = getLevels();
				if (foundLevels && SELF.validLevelsExp) {
					assertUrl(foundLevels, SELF.validLevelsExp);
				}
				currentLevels = foundLevels;

				triggerHandlers('onChange');
				lastUpdatedUrl = location.href + '';
				//console.log('disparando replicado do onChange.')
			} else {
				//console.log('impedindo disparo replicado do onChange.')
			}
		}, 1000);

	};

}).extend(function($, CONTEXT_DATA, TOOLS){
	TOOLS.log.checkpoint('Configurando serviços no Controller');

	var	EDITORIAL_SETTINGS = this.editorialSettings,
		Controller = this.Controller,
		CrossReference = this.CrossReference,

		commonWsOptions = {
			prd:'elections',
			idTurn:EDITORIAL_SETTINGS.turn,
			year:EDITORIAL_SETTINGS.year
		},
		commonStructs = this.commonStructs = {
			services:{
				prd:/^elections$/,
				idRegion:/^[0-5]$/,
				idUf:/^\d\d?$/,
				idCity:/^\d{1,5}$/,
				idTitle:/^\d{1,5}$/,
				orderBy:/^totalvotes|party|number|coalition|name|percentage|status$/i,
				order:/^ASC|DESC$/i,
				status:/^\d$/,
				coalition:String,
				idParty:/^\d{1,5}$/,
				year:/^20\d\d$/,
				idTurn:/^1|2$/,
				callback:String
			},
			bridges:{
				year:/^20\d\d$/,
				turn:/^1|2$/,
				regionName:/^todas|regiao-(norte|sul|sudeste|centro-oeste|nordeste)$/,
				ufName:/^[\w-_]+$/,
				cityName:/^[\w-_]+$/,
				titleName:/^presidente|senador|governador|deputado-federal|deputado-estadual|deputado-distrital$/
			}
		};

	Controller.setWsBaseUrl("http://p1.trrsf.com.br/contentAPI/elections/");
	//Controller.setWsBaseUrl("http://hlg-pubpacotes:8080/contentAPIbr/get"); // DSV

	Controller.services.create('getSummary', {
		struct:{ // ws params
			srv:/^getElectionsViewJSON$/,
			prd:commonStructs.services.prd,
			year:commonStructs.services.year,
			idTurn:commonStructs.services.idTurn,
			idRegion:commonStructs.services.idRegion,
			idCity:commonStructs.services.idCity,
			idTitle:commonStructs.services.idTitle,
			idUf:commonStructs.services.idUf,
			callback:commonStructs.services.callback
		},
		defaultValues:{
			prd:commonWsOptions.prd,
			srv:"getElectionsViewJSON",
			year:EDITORIAL_SETTINGS.year,
			idTurn:EDITORIAL_SETTINGS.turn,
			idRegion:'0',
			idUf:'0',
			idCity:'0',
			idTitle:'3',
			callback:'jsonp_getSummary'
		}
	})
	.setCrossReferenceBridge(
		new CrossReference.handler({
			struct:{ // user params
				year:commonStructs.bridges.year,
				turn:commonStructs.bridges.turn,
				regionName:commonStructs.bridges.regionName
			},
			defaultValues:{
				year:EDITORIAL_SETTINGS.year,
				turn:EDITORIAL_SETTINGS.turn,
				regionName:'todas'
			}
		})
	);

	Controller.services.create('getPresidentResults', {
		struct:{ // ws params
			prd:commonStructs.services.prd,
			srv:/^getPresidentPanelJSON$/,
			year:commonStructs.services.year,
			idTurn:commonStructs.services.idTurn,
			idRegion:commonStructs.services.idRegion,
			idUf:commonStructs.services.idUf,
			idCity:commonStructs.services.idCity,
			idTitle:commonStructs.services.idTitle,
			orderBy:/^country|state$/,
			order:commonStructs.services.order,
			callback:commonStructs.services.callback
		},
		defaultValues:{
			prd:commonWsOptions.prd,
			year:EDITORIAL_SETTINGS.year,
			idTurn:EDITORIAL_SETTINGS.turn,
			idCity:'0',
			srv:"getPresidentPanelJSON",
			idTitle:'1',
			orderBy:'state',
			order:'desc',
			callback:'json_getPresidentResults'
		}
	})
	.setCrossReferenceBridge(
		new CrossReference.handler({
			struct:{ // user params
				year:commonStructs.bridges.year,
				turn:commonStructs.bridges.turn,
				ufName:commonStructs.bridges.ufName
			},
			defaultValues:{
				year:EDITORIAL_SETTINGS.year,
				turn:EDITORIAL_SETTINGS.turn,
				ufName:'todos'
			}
		})
	);

	Controller.services.create('getStateSummary', {
		struct:{ // ws params
			prd:commonStructs.services.prd,
			srv:/^getStateSummaryJSON$/,
			year:commonStructs.services.year,
			idTurn:commonStructs.services.idTurn,
			idRegion:commonStructs.services.idRegion,
			idUf:commonStructs.services.idUf,
			idCity:commonStructs.services.idCity,
			idTitle:commonStructs.services.idTitle,
			callback:commonStructs.services.callback
		},
		defaultValues:{
			prd:commonWsOptions.prd,
			year:EDITORIAL_SETTINGS.year,
			idTurn:EDITORIAL_SETTINGS.turn,
			idCity:'0',
			srv:"getStateSummaryJSON",
			idTitle:'3',
			callback:'json_getStateSummary'
		}
	})
	.setCrossReferenceBridge(
		new CrossReference.handler({
			struct:{ // user params
				year:commonStructs.bridges.year,
				turn:commonStructs.bridges.turn,
				ufName:commonStructs.bridges.ufName
			},
			defaultValues:{
				year:EDITORIAL_SETTINGS.year,
				turn:EDITORIAL_SETTINGS.turn
			}
		})
	);

	Controller.services.create('getPartiesDetails', {
		struct:{ // ws params
			prd:commonStructs.services.prd,
			srv:/^getListCoalitionsJSON$/,
			year:commonStructs.services.year,
			idUf:commonStructs.services.idUf,
			idTitle:commonStructs.services.idTitle,
			callback:commonStructs.services.callback
		},
		defaultValues:{
			prd:commonWsOptions.prd,
			srv:"getListCoalitionsJSON",
			year:EDITORIAL_SETTINGS.year,
			callback:'json_getPartiesDetails'
		}
	})
	.setCrossReferenceBridge(
		new CrossReference.handler({
			struct:{ // user params
				year:commonStructs.bridges.year,
				turn:commonStructs.bridges.turn,
				ufName:commonStructs.bridges.ufName,
				titleName:commonStructs.bridges.titleName
			},
			defaultValues:{
				year:EDITORIAL_SETTINGS.year,
				turn:EDITORIAL_SETTINGS.turn
			}
		})
	);


	Controller.services.create('getDataByRole', {
		struct:{ // ws params
			srv:/^getDataByRoleJSON$/,
			prd:commonStructs.services.prd,
			year:commonStructs.services.year,
			idTurn:commonStructs.services.idTurn,
			idRegion:commonStructs.services.idRegion,
			idUf:commonStructs.services.idUf,
			idCity:commonStructs.services.idCity,
			idTitle:commonStructs.services.idTitle,
			orderBy:commonStructs.services.orderBy,
			order:commonStructs.services.order,
			idParty:commonStructs.services.idParty,
			coalition:commonStructs.services.coalition,
			status:commonStructs.services.status,
			callback:commonStructs.services.callback
		},
		defaultValues:{
			srv:"getDataByRoleJSON",
			prd:commonWsOptions.prd,
			year:EDITORIAL_SETTINGS.year,
			idTurn:EDITORIAL_SETTINGS.turn,
			//idRegion:'0',
			idCity:'0',
			orderBy:"TOTALVOTES",
			order:"DESC",
			idParty:'0',
			coalition:'',
			status:'0',
			callback:'json_getDataByRole'
		}
	})
	.setCrossReferenceBridge(
		new CrossReference.handler({
			struct:{ // user params
				year:commonStructs.bridges.year,
				turn:commonStructs.bridges.turn,
				ufName:commonStructs.bridges.ufName,
				titleName:commonStructs.bridges.titleName,
				cityName:commonStructs.bridges.cityName
			},
			defaultValues:{
				year:EDITORIAL_SETTINGS.year,
				turn:EDITORIAL_SETTINGS.turn,
				ufName:'todos',
				cityName:'todas'
			}
		})
	);

}).extend(function($, CONTEXT_DATA, TOOLS){
	
	var CURRENT_NAMESPACE = this;
	
	var sortableTable = this.sortableTable = function(){

		var CONSTANTS;

		return function (customOptions) {
			if (!(this instanceof sortableTable)) {
				return new sortableTable(customOptions);
			}

			if (!CONSTANTS) {
				CONSTANTS = {
					options:{
						defaults:{
							initialTriggerSelector:null,
							orderByHeaderAttribute:'class',
							ascOrderClassName:'asc',
							descOrderClassName:'desc'
						},
						struct:{
							containerSelector:String,
							ascOrderClassName:String,
							descOrderClassName:String,
							sortableHeadersConfigs:Array,
							validOrderByValuesEXP:RegExp,
							// required
							onChange:Function
						}
					},
					headerConfigsStruct:{
						selector:String,
						toggleOrderList:Array,
						orderByFieldId:String
					}
				}
			}
						
			var SELF = this;
			
			var	options = $.extend({}, CONSTANTS.options.defaults, customOptions || {});
			
			var structErrors = TOOLS.getStructErrors({
				data:options,
				model:CONSTANTS.options.struct
			});
			if (structErrors) {
				throw '[sortableTable] » '+structErrors;
			}

			var $container = $(options.containerSelector);
			if (!$container.length) {
				throw 'Seletor incorreto: ' + options.containerSelector;
			}
			var headerConfigsErrors = '',
				$headerTriggers,
				active;
				
			CONSTANTS.headerConfigsStruct.orderByFieldId = options.validOrderByValuesEXP;			
			for (var i = 0, current; current = options.sortableHeadersConfigs[i]; i++) {
				structErrors = TOOLS.getStructErrors({
					data:current,
					model:CONSTANTS.headerConfigsStruct
				});
				if (structErrors) {
					headerConfigsErrors += ' Erro na definição do parâmetro "sortableHeadersConfigs", index ' + i + '. >> ' +structErrors;
					continue;
				}
				
				current.$element = $container.find(current.selector);
				if (!current.$element.length) {
					headerConfigsErrors += ' Não foi possível localizar um cabeçalho com seletor especificado parâmetro "sortableHeadersConfigs", index '+ i +'. (' + current.selector + ')';
					continue;
				}
				if (!$headerTriggers) {
					$headerTriggers = current.$element;
				} else {
					$headerTriggers = $headerTriggers.add(current.$element);
				}
				current.$element.data('index', i);
				
			}
			if (headerConfigsErrors) {
				throw '[sortableTable] » ' + headerConfigsErrors;
			}
			
			
			if (!options.sortableHeadersConfigs.length || !$headerTriggers.length) {
				throw 'O parâmetro "sortableHeadersConfigs" é um array vazio ou foi populado incorretamente: ' + options.sortableHeadersConfigs.join(', ');
			}

			this.order = null;
			this.orderBy = null;
			
			if (typeof options.initialTriggerSelector == 'string') {
				
				var $initialOrderTrigger = $headerTriggers.filter(options.initialTriggerSelector);
				
				if ($initialOrderTrigger.length) {
					$initialOrderTrigger.addClass('desc');
					active = options.sortableHeadersConfigs[$initialOrderTrigger.data('index')];
				}
			}
			
			$headerTriggers.click(function(){
				var $this = $(this),
					current = options.sortableHeadersConfigs[$this.data('index')];
				
				if (active) {
					
					if (active.selector == current.selector) {
						current.orderIndex = current.orderIndex || 0;
						$this.removeClass(options[current.toggleOrderList[current.orderIndex] + 'OrderClassName']);
						current.orderIndex = current.orderIndex < current.toggleOrderList.length - 1 ?  current.orderIndex + 1 : 0;
						
						active = current;
					} else {
						$this.siblings().removeClass(options.ascOrderClassName).removeClass(options.descOrderClassName);					 
						active.orderIndex = 0;
					}
				} else {
					$headerTriggers.removeClass(options.ascOrderClassName).removeClass(options.descOrderClassName);
				}
				active = current;

				SELF.orderBy = current.orderByFieldId;
				SELF.order = current.toggleOrderList[current.orderIndex || 0];

				$this.addClass(options[SELF.order + 'OrderClassName']);
				
				try {					
					options.onChange({
						orderBy:SELF.orderBy,
						order:SELF.order 
					});
				} catch (e) {
					e.message = 'Erro ao disparar evento "onChange" para o seletor ' + options.containerSelector + '\n<br/> » '+ e.message;
					TOOLS.log.critical(e);
				}
			});
			
			return;
		};
	}();
	

	TOOLS.log.checkpoint('Disponibilizando comportamento para o módulo 479 (Tabela de candidados)');
	this.mod479 = function (customOptions) {
	
		var CONSTANTS;

		return function (customOptions) {
			if (!(this instanceof CURRENT_NAMESPACE.mod479)) {				
				return new CURRENT_NAMESPACE.mod479(customOptions);
			}

			if (!CONSTANTS) {
				CONSTANTS = {
					options:{
						defaults:{
							containerSelector:'table.mod-479:first',
							initialTriggerSelector:'th.valid',
							validOrderByValuesEXP:/^totalvotes|party|number|coalition|name|percentage|status$/i,
							sortableHeadersConfigs:[
								{ selector:'th.candidate', toggleOrderList:['asc', 'desc'], orderByFieldId:'name' },
								{ selector:'th.number', toggleOrderList:['asc', 'desc'], orderByFieldId:'number' },
								{ selector:'th.party', toggleOrderList:['asc', 'desc'], orderByFieldId:'party' },
								{ selector:'th.coligation', toggleOrderList:['asc', 'desc'], orderByFieldId:'coalition' },
								{ selector:'th.votes', toggleOrderList:['desc', 'asc'], orderByFieldId:'totalvotes' },
								{ selector:'th.valid', toggleOrderList:['desc', 'asc'], orderByFieldId:'percentage' }
							]
						},
						struct:{
							containerSelector:String,
							validOrderByValuesEXP:RegExp,
							sortableHeadersConfigs:Array,
							// required
							onChange:Function
						}
					},
					instances:{}
				}
			}
			
			var options = $.extend({}, CONSTANTS.options.defaults, customOptions || {});

			var structErrors = TOOLS.getStructErrors({
				data:options,
				model:CONSTANTS.options.struct
			});
			if (structErrors) {
				TOOLS.log.critical('[mod479] » '+structErrors);
				return;
			}

			var $container = $(options.containerSelector);
			if (!$container.length) {
				TOOLS.log.critical('Não foi possível encontrar um elemento com valor especificado para o parâmetro "containerSelector" : ' + options.containerSelector);
				return;
			}
			
			var instanceId = encodeURIComponent(options.containerSelector);
			if (CONSTANTS.instances[instanceId]) {
				TOOLS.log.critical('[mod479] » Chamada duplicada. A camada de comportamento já foi carregada para o seletor <strong>'+options.containerSelector+'</strong>');
				return;
			}

			try {
				CONSTANTS.instances[instanceId] = new sortableTable(options);
			} catch (e) {
				TOOLS.log.critical(e);
			}
		 
		};
	}();
	
	
}).extend(function($, CONTEXT_DATA, TOOLS) {
	this.getLayer = function(options){

		var layer = (function ($){

			var target;
			return {

				CONSTRUCTOR: function(){
					layer.bindEvents();
				},

				bindEvents: function(){
					$('table.mod-487, table.mod-488, table.mod-486').click(function(evt){
						if (evt.target.tagName.match(/^span$/i)) {
						        target = evt.target;
								$(target).siblings('div').addClass('on').parent('div').addClass('on').find('a').click(function(evt){
									evt.preventDefault();
									$(this).parents('div.tooltip, div.tooltipContainer ').removeClass('on');
								});
						    };
					});

					$('div.moreInfoLayer').find('span').click(function(evt){
						$(this).parents('div.moreInfoLayer').addClass('on').find('a').click(function(evt){
							evt.preventDefault();
							$('div.moreInfoLayer').removeClass('on');
						});
					});

				}

			};

		})(jQuery);


		layer.CONSTRUCTOR();

	}
	
	//TSE - Banner and divulga brasil download 
	var containers = $('.mod-492-tse, .mod-492-tse-results'),
		seven = /NT 6./,		
		mac = /Mac/,
		linux = /Linux/;		
		
	if (containers.length){
		if (seven.test(navigator.userAgent)){
				TOOLS.log.checkpoint('Trocando o link do divulga brasil para plataformas windows seven e vista');
				containers.find('a').attr('href','http://eleicoes.terra.com.br/app-divulga/Instalador_Divulga2010_1.1.0-WinVista_Win7.zip');					
			} else if(mac.test(navigator.userAgent)){
				TOOLS.log.checkpoint('Trocando o link do divulga brasil quando a plataforma é mac');
				containers.find('a').attr('href','http://eleicoes.terra.com.br/app-divulga/Divulga2010-1.1.0-MacOS.zip');	
			} else if(linux.test(navigator.userAgent)){
				TOOLS.log.checkpoint('Trocando o link do divulga brasil quando a plataforma é linux');
				containers.find('a').attr('href','http://eleicoes.terra.com.br/app-divulga/Divulga2010-1.0.0.zip');	
			}
	};			

}).extend(function($, CONTEXT_DATA, TOOLS) {
	this.startCombo = function(options){

		var cityCountingCombo = (function ($){

			var container = $('#citySuggestion'),
				clearButton = $('a.clearCombo','#mod-484');

			return {

				CONSTRUCTOR: function (){
					cityCountingCombo.bindEvents();
				},

				bindEvents: function (){
					container.focus(function (evt){
						evt.preventDefault();
						if (container.val() == 'Digite a cidade'){
							container.val('').addClass('active');
						}
						clearButton.removeClass('show');
					}).blur(function (){
						container.removeClass('active');
						if (container.val().length > 0){
							container.addClass('selected');
							clearButton.addClass('show');
						} else {
							cityCountingCombo.unloadCombo();
						}
					});

					clearButton.click(function (evt){
						evt.preventDefault();
						cityCountingCombo.unloadCombo();
						clearButton.removeClass('show');

					});
				},

				unloadCombo: function (){
					container.val('Digite a cidade');
					container.removeClass('selected');
				}
			};
		})(jQuery);

		cityCountingCombo.CONSTRUCTOR();

		var settings = {
			customScroll: true,
			height: 150
		}

		// BY LIST
		$('.droplist-by-list').droplist(settings, function() {
			var that = this;
			that.list.find('li').bind('click', function() {
				that.set(this);
				return false;
			});
		});

	}

}).extend(function($, CONTEXT_DATA, TOOLS) {	
	
	var CURRENTNAMESPACE = this; 
	
	//Rendering table services

	var dinamycContent = {
		getHtmlDashbord: function(candidates, type){
			var content = "";
			var style = "";
			var styleElect = "";
			var minLength = 3;
			
			if (window.trrContextData.turn == 2) minLength = 2;
			
			if (candidates != undefined) {
				if (candidates.length > 0) {
					for (var i=0; i<Math.min(minLength, candidates.length); i++){
						if (i ==  candidates.length-1) style = "last";
					
						if (candidates[i].STATUS_ID == 1) styleElect = "eleito";
						else if (candidates[i].STATUS_ID == 6) styleElect = "turn2";
						else if (candidates[i].STATUS_ID == 50) styleElect = "matEle";
						else if (candidates[i].STATUS_ID == 51) styleElect = "mat2";
						
						content += '<tr class="'+ style +'"><td class="candidate">'+
						  '<div>' + candidates[i].NAME + '<span class="partido">' + candidates[i].PARTY + '</span></div></td>'+ 
						  '<td class="percent"><div>' + candidates[i].PERCENTAGE + '</div></td>'+
						  '<td class="votes"><div>' + candidates[i].TOTALVOTES; 
						  
						if (type != "populate")	content += ' votos';
						
					    content += '</div></td><td class="status">';
		
							if (styleElect != "") content += '<div class="' + styleElect + '"><em>eleito</em></div>';
						  
						content += '</td></tr>';
						
						styleElect = ""; 
						style = "";
					}
				} else {
					
					if (candidates.STATUS_ID == 1) styleElect = "eleito";
					else if (candidates.STATUS_ID == 6) styleElect = "turn2";
					else if (candidates.STATUS_ID == 50) styleElect = "matEle";
					else if (candidates.STATUS_ID == 51) styleElect = "mat2";
					
					content += '<tr class="last"><td class="candidate">'+
					  '<div>' + candidates.NAME + '<span class="partido">' + candidates.PARTY + '</span></div></td>'+ 
					  '<td class="percent"><div>' + candidates.PERCENTAGE + '</div></td>'+
					  '<td class="votes"><div>' + candidates.TOTALVOTES; 
					  
					if (type != "populate")	content += ' votos';
					
				    content += '</div></td><td class="status">';
	
						if (styleElect != "") content += '<div class="' + styleElect + '"><em>eleito</em></div>';
					  
					content += '</td></tr>';
					
					styleElect = ""; 
					style = "";
					
				}
			}
			
			return content;
		},	

		getHtmlDeputis: function(candidates){
			var content = "";
			var style = "";
			var styleElect = "";
			var minLength = 3;
			
			if (window.trrContextData.turn == 2) minLength = 2;
			
			for (var j=0; j<Math.min(minLength, candidates.length); j++){
				if (j == candidates.length-1) style = "last";
				
				if (candidates[j].STATUS_ID == 1) styleElect = "eleito";
				else if (candidates[j].STATUS_ID == 6) styleElect = "turn2";
				else if (candidates[j].STATUS_ID == 50) styleElect = "matEle";
				else if (candidates[j].STATUS_ID == 51) styleElect = "mat2";
				
				content += '<tr class="'+ style +'"><td class="candidate"> <div>' + candidates[j].NAME + '<span class="partido">' + candidates[j].PARTY + '</span> </div></td>'+ 
				'<td class="votes"> <div>' + candidates[j].TOTALVOTES + '</div> </td>'+
				'<td class="status">';
				
				if (styleElect != "") content += '<div class="' + styleElect + '"><em>eleito</em></div>';
	 
				content += '</td></tr>';
				
				styleElect = "";
				style = "";
			}
			
			return content;
		},	
		
		getHtmlDeputisLabel: function(candidates){
			var content = "";
			var style = "";
			var minLength = 3;
			
			if (window.trrContextData.turn == 2) minLength = 2;
			
			for (var b=0; b<Math.min(minLength, candidates.length); b++){
				if (b == candidates.length-1) style = "last";
				
				content += '<tr class="'+ style +'"><td class="candidate"> <div>'+candidates[b].PARTY+'</div></td>'+ 
							'<td class="votes last"> <div>'+candidates[b].TOTALVOTES+'</div> </td>' +
							'<td class="status last"></td></tr>';
				
			}
			
			return content;
		},	
		
		candidatesTable: function(candidates){
		
			var candidate = null;
			var content = "";
			var style = "";
			var coalition = ""
			
			if (candidates.length > 0){
				
				for (var f=0; f<candidates.length; f++){
					candidate = candidates[f];
					
					if (candidate.STATUS_ID == 1) style = "elected";
					else if (candidate.STATUS_ID == 6) style = "secondTurn";
					else if (candidate.STATUS_ID == 50) style = "matElected";
					else if (candidate.STATUS_ID == 51) style = "matSecondTurn";
					
					if (candidate.COALITION == undefined) coalition = "";
					else coalition = candidate.COALITION;
					
					content += '<tr class="'+ style +'">'+
					'<td class="candidate">' + candidate.NAME + '</td>'+
					'<td class="number">' + candidate.number + '</td>'+
					'<td class="party">' + candidate.PARTY + '</td>'+
					'<td class="coligation">' + coalition + '</td>'+
					'<td class="votes">' + candidate.TOTALVOTES + '</td>'+
					'<td class="valid">' + candidate.PERCENTAGE + '</td>'+
					'<td class="status"><span>Eleito</span></td>'+															
					'</tr>';
					
					style = "";
				}
			} else {
				candidate = candidates;
				
				if (candidate.STATUS_ID == 1) style = "elected";
				else if (candidate.STATUS_ID == 6) style = "secondTurn";
				else if (candidate.STATUS_ID == 50) style = "matElected";
				else if (candidate.STATUS_ID == 51) style = "matSecondTurn";
				
				if (candidate.COALITION == undefined) coalition = "";
				else coalition = candidate.COALITION;
				
				content += '<tr class="'+ style +'">'+
				'<td class="candidate">' + candidate.NAME + '</td>'+
				'<td class="number">' + candidate.number + '</td>'+
				'<td class="party">' + candidate.PARTY + '</td>'+
				'<td class="coligation">' + coalition + '</td>'+
				'<td class="votes">' + candidate.TOTALVOTES + '</td>'+
				'<td class="valid">' + candidate.PERCENTAGE + '</td>'+
				'<td class="status"><span>Eleito</span></td>'+															
				'</tr>';
				
				style = "";
			}
			
			
			return content;
			
		},

		validatedVotesTable: function(results){
			if (results){
				var totalVotesNominais = (results[0].TOTALVOTES != undefined)? results[0].TOTALVOTES : "",
					totalVotesLegenda = (results[1].TOTALVOTES != undefined)? results[1].TOTALVOTES : "",
					content;
				
				content =
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="nominalVotes">Votos Nominais</span>'+
									'<div class="tooltip">'+
										'<h5 class="nominal">Votos Nominais</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos nominais"?</h6>'+
										'<p>Número de votos que foram atribuídos a algum candidato.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ results[0].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ results[0].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="partyVotes">Votos em Legenda</span>'+
									'<div class="tooltip">'+
										'<h5 class="party">Votos em Legenda</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos em Legenda"?</h6>'+
										'<p>Número de votos que foram atribuídos à legenda de algum partido.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ results[1].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ results[1].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>';														
				
				return content;
			} else {
				return "";
			}
		},
		
		refinedVotesTable: function(refinedVotesDetails){
			var content = 
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="validVotes">Votos válidos</span>'+
									'<div class="tooltip">'+
										'<h5 class="valid">Votos válidos</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos válidos"?</h6>'+
										'<p>Número total dos votos que foram atribuídos ou a algum candidato ou a alguma legenda. É a diferença entre os votos totalizados e os votos brancos, nulos e pendentes. Também pode ser considerado como a soma dos votos nominais e os votos de legenda.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ refinedVotesDetails[0].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ refinedVotesDetails[0].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="nullVotes">Votos nulos</span>'+
									'<div class="tooltip">'+
										'<h5 class="null">Votos nulos</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos nulos"?</h6>'+
										'<p>Número de votos nulos. Consideram-se votos nulos aqueles que o eleitor anulou mais os votos das seções anuladas, pois os votos das seções anuladas também são contabilizados como nulos.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ refinedVotesDetails[1].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ refinedVotesDetails[1].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="whiteVotes">Votos em branco</span>'+
									'<div class="tooltip">'+
										'<h5 class="white">Votos nulos</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos em branco"?</h6>'+
										'<p>Número de votos em branco. Votos em branco são os aqueles que o próprio eleitor marcou como \'BRANCO\'.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ refinedVotesDetails[2].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ refinedVotesDetails[2].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="pendingVotes">Votos pendentes</span>'+
									'<div class="tooltip">'+
										'<h5 class="pending">Votos pendentes</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Votos pendentes"?</h6>'+
										'<p>Número de votos de urnas anuladas e apuradas em separado, ou seja, a seção foi tida como apurada, mas, por motivos diversos, os votos daquela seção não são totalizados, ficando pendentes e sendo totalizados posteriormente.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ refinedVotesDetails[3].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ refinedVotesDetails[3].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>';
						
			return content;
		},
		
		
		attendancesTable: function(attendances){
		
			var totalVotesEle = (attendances[2].TOTALVOTES != undefined)? attendances[2].TOTALVOTES : "",				
				content;
				
				content = 
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="totalAttendance">Total Comparecimento</span>'+
									'<div class="tooltip">'+
										'<h5 class="attendance">Total Comparecimento</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Total Comparecimento"?</h6>'+
										'<p>Número de eleitores que compareceram nas seções totalizadas.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ attendances[0].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ attendances[0].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="totalAbstentions">Total de abstenções</span>'+
									'<div class="tooltip">'+
										'<h5 class="abstentions">total de abstenções</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Total de Abstenções"?</h6>'+
										'<p>Número de eleitores que não compareceram nas seções totalizadas.</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ attendances[1].TOTALVOTES +'</td>'+
							'<td>'+
								'<strong>'+ attendances[1].PERCENTAGE +'</strong>'+
							'</td>'+
						'</tr>'+
						'<tr>'+
							'<td>'+
								'<div class="tooltipContainer">'+
									'<span class="electors">Eleitores</span>'+
									'<div class="tooltip">'+
										'<h5 class="electors">total de abstenções</h5>'+
										'<a href="#" class="tooltip-close" title="fechar">fechar</a>'+
										'<h6>O que significa "Eleitores"?</h6>'+
										'<p>Número total dos eleitores aptos nas seções totalizadas (comparecimento + abstenção).</p>'+
									'</div>'+
								'</div>'+
							'</td>'+
							'<td>'+ totalVotesEle +'</td>'+
							'<td>'+
								'<strong>&nbsp;</strong>'+
							'</td>'+
						'</tr>';						
						
				return content;						
		},
		
		presidentPane: function (data) {
	
			var presidents = data.results,
				len = presidents.length,
				minLength = presidents.length,
				content = '',
				style = null,
				styleElect = null;
			
			if (window.trrContextData.turn == 2) minLength = 2;
			
			for (var i = 0; i < Math.min(minLength, len); i++) {
			
				var president = presidents[i];
				
				if (i == (len - 1)) style = 'last';
				
				styleElect = '';
				if (president.STATUS_ID == 1) styleElect = 'eleito';
				else if (president.STATUS_ID == 6) styleElect = 'turn2';
				else if (president.STATUS_ID == 50) styleElect = 'matEle';
				else if (president.STATUS_ID == 51) styleElect = 'mat2';
				
				content += '<tr class="' + style + '"><td class="candidate"><div>' + president.NAME + '</div><span class="partido">' + president.PARTY + '</span></td>' +
					'<td class="percent"><div><em>' + president.STATEPERCENTAGE + '</em></div></td>' +
					'<td class="percent"> <div><em>' + president.NATIONALPERCENTAGE + '</em></div></td>' +
					'<td class="status">';
				
					if (styleElect != '') {
						content += '<div class="' + styleElect + '"><em>' + president.STATUS + '</em></div>';
					}
				
				content +=	'</td></tr>';
				
				styleElect = '';
				style = '';
			
			}
			
			content += '<tr class="last"><td colspan="4" class="vote"> % votos v&aacute;lidos </td></tr>' +
						'<tr><td class="candidate"><div> Brancos  </div></td><td class="percent"> <div><em>' + data.status.blank.STATEPERCENTAGE+'</em></div></td>' +
						'<td class="percent"><div><em>' + data.status.blank.NATIONALPERCENTAGE + '</em></div> </td><td class="status last"></td></tr>' +
						'<tr class="last"><td class="candidate"> <div>Nulos  </div></td><td class="percent"> <div><em>' + data.status['null'].STATEPERCENTAGE + '</em></div></td>' +
						'<td class="percent"><div><em>' + data.status['null'].NATIONALPERCENTAGE + '</em></div> </td><td class="status last"></td></tr>' +
						'<tr class="last"><td colspan="4" class="vote"> % votos totais </td></tr>' +
						'<tr><td class="candidate"><div> Apurados  </div></td><td class="percent"> <div><em>' + data.status.refined.STATEPERCENTAGE + '</em></div></td>' +
						'<td class="percent"><div><em>' + data.status.refined.NATIONALPERCENTAGE+'</em></div> </td><td class="status last"></td></tr>' +
						'<tr class="last"><td class="candidate"> <div>N&atilde;o Apurados  </div></td><td class="percent"> <div><em>'+data.status.notRefined.STATEPERCENTAGE+'</em></div></td>' +
						'<td class="percent"><div><em>' + data.status.notRefined.NATIONALPERCENTAGE+'</em></div> </td><td class="status last"></td></tr>';
						
			
			
			return content;
		
		},
		
		getInfoHTML: function(result){
			
			var notrefinedtottals = result.NOTREFINEDTOTALS;
			var refinedtottals = result.REFINEDTOTALS;
			var date = result.LASTUPDATE;
			
			
			var content = '<span class="first"> Apurados: <em class="numbers">' + refinedtottals + 
			   '</em></span><span>N&atilde;o apurados: <em class="numbers">' + notrefinedtottals + 
			   '</em></span><span class="last">&Uacute;ltima atualiza&ccedil;&atilde;o: <em class="numbers">'+ date.split(" ")[0].split("/")[0] +'/'+date.split(" ")[0].split("/")[1]+'/' + date.split(" ")[0].split("/")[2].substring(2)+ '&nbsp;&agrave;s&nbsp;'+ date.split(" ")[1] +
			   '</em></span>';
			
			return content;
		},
		
		getInfoGovHTML: function(result){
			
			var refinedtottals = result.REFINEDTOTALS;
			var date = result.LASTUPDATE;
			
			if (refinedtottals){
				var content = 'apurados: <em class="numbers">' + refinedtottals.split("(")[1].split(")")[0] +
				   '</em> (&uacute;ltima atualiza&ccedil;&atilde;o: <em class="numbers">' + date.split(" ")[0].split("/")[0] +'/'+date.split(" ")[0].split("/")[1]+'/' + date.split(" ")[0].split("/")[2].substring(2) +'&nbsp;&agrave;s&nbsp; '+  date.split(" ")[1] +
				   '</em>)';
			}
			
			return content;
		},
		
		infoTableHTML: function(result){
			
			var refinedtottals = result.REFINEDTOTALS;
			var notrefinedtottals = result.NOTREFINEDTOTALS;
			var date = result.LASTUPDATE;
			
			if (refinedtottals){
				var content = '<li><span>Apurados:<em>'+refinedtottals+'</em>|&nbsp</span></li>'+
								'<li><span>N&atilde;o Apurados:<em>'+notrefinedtottals+'</em>|&nbsp;</span></li>'+
								'<li><span>&Uacute;ltima atualiza&ccedil;&atilde;o:<em>' + date.split(" ")[0].split("/")[0] +'/'+date.split(" ")[0].split("/")[1]+'/' + date.split(" ")[0].split("/")[2].substring(2) +'&nbsp;&agrave;s&nbsp;'+  date.split(" ")[1] +'</span></li>';
			}
			
			return content;
		},
		
		getCityList: function(data, wrapper, write){
			var item = null;
			var list = "";
			var style = "";
			var itemTemp = null;
			
			if (data.length > 0){
				for (var content = 0; content < data.length; content++){
					item = data[content];
					
					if (content == 0) style = "first";
					else style = "";
					
					itemTemp = item.LABEL.replace(/á/gi,"a").replace(/ã/gi,"a").replace(/â/gi,"a");
					itemTemp = itemTemp.replace(/ó/gi,"o").replace(/ô/gi,"o").replace(/õ/gi,"o");
					itemTemp = itemTemp.replace(/é/gi,"e").replace(/ê/gi,"e");
					itemTemp = itemTemp.replace(/í/gi,"i").replace(/ú/gi,"u").replace(/ç/gi,"c");
					
					if (write != ""){
						if ( item.LABEL.match(new RegExp(write,"gi")) || itemTemp.match(new RegExp(write ,"gi"))  ) list += '<li id="'+item.RAW_LABEL+'" class="' + style + '"><a href="#'+item.RAW_LABEL+'">'+item.LABEL+'</a></li>';
					}
				}
			} else {
				item = data;
				
				if (content == 0) style = "first";
				else style = "";
				
				itemTemp = item.LABEL.replace(/á/gi,"a").replace(/ã/gi,"a").replace(/â/gi,"a");
				itemTemp = itemTemp.replace(/ó/gi,"o").replace(/ô/gi,"o").replace(/õ/gi,"o");
				itemTemp = itemTemp.replace(/é/gi,"e").replace(/ê/gi,"e");
				itemTemp = itemTemp.replace(/í/gi,"i").replace(/ú/gi,"u").replace(/ç/gi,"c");
				
				if (write != ""){
					if ( item.LABEL.match(new RegExp(write,"gi")) || itemTemp.match(new RegExp(write ,"gi")) ) list += '<li id="'+item.RAW_LABEL+'" class="' + style + '"><a href="#'+item.RAW_LABEL+'">'+item.LABEL+'</a></li>';
				}
			}
			
			return '<div class="sugestionList"><div class="scrollpane"><ul>'+list+'</ul></div></div>';
		},
		
		getComboFilterList: function(data){
			var item = null;
			var list = "";
			var style = "";
			
			if (data.length > 0){
				for (var t = 0; t < data.length; t++){
					item = data[t];
					
					list += '<li id="'+item.ID+'"><a href="#'+item.ID+'">'+item.LABEL+'</a></li>';
				}
			} else {
				
				item = data;
				
				list += '<li id="'+item.ID+'"><a href="#'+item.ID+'">'+item.LABEL+'</a></li>';
				
			}
			
			return list;
		}
	}


	this.countignActions = {

		buildComboFilters:  function(data, wrapper){
		
			$(wrapper + " ul.party").html('<li id="todos" class="first"><a href="todos">todos os partidos</a></li>'+dinamycContent.getComboFilterList(data.parties));
			
			if (data.coalitions != undefined) {
				$(wrapper + " ul.coligation").html('<li id="coligacao" class="first"><a href="coligacao">todas as coliga&ccedil;&otilde;es</a></li>'+dinamycContent.getComboFilterList(data.coalitions));
			}
			
			
		},
		buildFilters: function(data, wrapper){
			var dropList = $(wrapper+ " .sugestionList"); 
			var combo = $(wrapper).find(".citySuggestion");
			var clearButton = $('a.clearCombo','.mod-484');
			
			if (dropList.html())$(wrapper+ " .sugestionList").remove() 
			
			$(wrapper).append( dinamycContent.getCityList( data, wrapper, combo.val() ) );
			
			dropList = $(wrapper+ " .sugestionList");
			
			dropList.find("li a").click(function(evt){
				if ( window.event != undefined) window.event.cancelBubble=true; 
				else evt.stopPropagation();
				evt.preventDefault();

				combo.val( $(evt.target).html() );
				dropList.hide();
				
				combo.removeClass('active');
				combo.addClass('selected');
				clearButton.addClass('show');
				
				CURRENTNAMESPACE.filters.definitions.cityLabel = $(evt.target).html();
				CURRENTNAMESPACE.filters.definitions.city = $(evt.target).attr("href").replace(/^.*#/,''); 
				CURRENTNAMESPACE.filters.getInfoByCity();
			});
			
			$(wrapper+ " .sugestionList .scrollpane").jScrollPane();
		},
		presidentDashboard: function(result, wrapper, contentInfo){
			
			var votes = parseInt(result.president.REFINEDTOTALS.split('(')[0], 10);
			
			if (votes > 0){
				$(wrapper).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(result.president.results,"dashboard"));
				$(contentInfo).html(dinamycContent.getInfoHTML(result.president));
			}
			
		},

		governorDashboard: function(result, wrapper, contentInfo){
			
			var votes = parseInt(result.status.REFINEDTOTALS.split('(')[0], 10);
			
			if (votes > 0){
				$(wrapper).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(result.governor,"dashboard"));
				$(contentInfo).html(dinamycContent.getInfoHTML(result.status));
			}
		},

		senDashboard: function(result, wrapper, contentInfo){
			var votes = parseInt(result.status.REFINEDTOTALS.split('(')[0], 10);
			
			if (votes > 0){
				$(wrapper).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(result.senator,"dashboard"));
			}
		},
		
		depDashboard: function(result, wrapper){
			
			var candidates = result.candidates;
			var labels = result.partyScores;
			var content = "";
			
				content += '<tbody><tr><th class="candidate">Candidato</th><th class="votes">Nº de votos</th><th class="last"></th></tr>' + 
							dinamycContent.getHtmlDeputis(candidates) + '</tbody>';
				content += '<tbody class="legenda"><tr><th class="legenda">Votos na legenda</th><th class="votes">Nº de votos</th><th class="last"></th></tr>' + 
							dinamycContent.getHtmlDeputisLabel(labels) + '</tbody>';
				
				$(wrapper).find(".dashboard").html(content);
			
		},
		
		governorTable: function(result, wrapperCT, wrapperVV, wrapperRV, wrapperAT, wrapperInfo){
			var votes = parseInt(result.status.REFINEDTOTALS.split('(')[0], 10);

			$(wrapperInfo).find("ul").html(dinamycContent.infoTableHTML(result.status));
			
			if (votes > 0){
				if (result){ 

					$(wrapperCT).find("tbody").html(dinamycContent.candidatesTable(result.candidates));
					$(wrapperVV).find("tbody").html(dinamycContent.validatedVotesTable(result.votesDetails));
					$(wrapperRV).find("tbody").html(dinamycContent.refinedVotesTable(result.refinedVotesDetails));
					$(wrapperRV).find("tfoot").html('<tr><td><strong>Total de votos apurados</strong></td><td colspan="2">'+result.refinedVotesDetails[4].TOTALVOTES+'</td></tr>');
					$(wrapperAT).find("tbody").html(dinamycContent.attendancesTable(result.attendances));
					
				} else {
					
					$(wrapperRV).find("tfoot").html('<tr><td><strong>Total de votos apurados</strong></td><td colspan="2">0</td></tr>');
					$(wrapperCT).find("tbody").html('<tr><td class="candidate" colspan="7" align="center" ><strong>Aguardando dados do TSE</strong></td></tr>');	
					$(wrapperVV).find("tbody").html('<tr><td class="candidate" colspan="7" align="center" ><strong>Aguardando dados do TSE</strong></td></tr>');
					$(wrapperRV).find("tbody").html('<tr><td class="candidate" colspan="7" align="center" ><strong>Aguardando dados do TSE</strong></td></tr>');
					$(wrapperAT).find("tbody").html('<tr><td class="candidate" colspan="7" align="center" ><strong>Aguardando dados do TSE</strong></td></tr>');
					
				}
			}
		},
		presidentPanel: function(result, wrapper){
				$(wrapper).find("tbody").html(dinamycContent.presidentPane(result));
		},
		
		govPopulate: function (result, region){
			
			var cityes = null;
			var votes = parseInt(result.president.REFINEDTOTALS.split('(')[0], 10);
			
			if (region != 0){
			
				if (region == 1) cityes = result.governor[1];
				else if (region == 2) cityes = result.governor[2];
				else if (region == 3) cityes = result.governor[3];
				else if (region == 4) cityes = result.governor[4];
				
				for (d=0; d<cityes.length; d++){
					$("#uf_" + cityes[d].ID_UF).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(cityes[d].data.results,"populate"));
					$("#uf_" + cityes[d].ID_UF).find(".info").html(dinamycContent.getInfoGovHTML(cityes[d].data));
				}
				
			} else {
				if (votes > 0){
					for (c in result.governor) {
						cityes = result.governor[c];
						
						if (cityes.length > 0){
							for (d=0; d<cityes.length; d++){
								$("#uf_" + cityes[d].ID_UF).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(cityes[d].data.results,"populate"));
								$("#uf_" + cityes[d].ID_UF).find(".info").html(dinamycContent.getInfoGovHTML(cityes[d].data));
							}
						} else {
							$("#uf_" + cityes.ID_UF).find(".dashboard").find("tbody").html(dinamycContent.getHtmlDashbord(cityes.data.results,"populate"));
							$("#uf_" + cityes.ID_UF).find(".info").html(dinamycContent.getInfoGovHTML(cityes.data));
						}
						
						if (!$("#uf_" + cityes.ID_UF).find(".dashboard").find("tfoot").html())$("#uf_" + cityes.ID_UF).find(".dashboard").append('<tfoot><tr class="last"><td></td><td> % votos </td><td> nº votos </td><td></td></tr></tfoot>');
					}
				}
			} 
		}
	}
	
	this.filters = {
			
			definitions:{
				tab: "#tab4",
				stateName:"",
				type:"",
				city:"",
				party:"",
				coalition:"",
				status:"",
				cityLabel:""
			},			
			getInfoByCity: function(){
				var party = this.definitions.party != "" ? parseInt( this.definitions.party ) : 0;
				var status = this.definitions.status != "" ? parseInt( this.definitions.status ) : 0;
				var coalition = this.definitions.coalition != "" ? parseInt( this.definitions.coalition) : '';
				var city = this.definitions.city;
				var type = 'governador';
				
				$(this.definitions.tab+" .mod-490-b h5").html(this.definitions.cityLabel);
				
				if (this.definitions.cityLabel == '' || this.definitions.cityLabel == 'todos' ) $(this.definitions.tab+" .mod-490-b h5").html( this.definitions.stateName.replace(/-/gi, " ") );
				
				if (this.definitions.type == ""){
					
					if (CURRENTNAMESPACE.editorialSettings.turn == "1"){
						if (this.definitions.tab == "#tab3") type = 'senador';
						else if (this.definitions.tab == "#tab4") type = 'deputado-federal';
						else if (this.definitions.tab == "#tab5") type = 'deputado-estadual';
					} else {
						if (this.definitions.tab == "#tab2") type = 'governador2';
						else if (this.definitions.tab == "#tab3") type = 'governador1';
						else if (this.definitions.tab == "#tab4") type = 'senador';
						else if (this.definitions.tab == "#tab5") type = 'deputado-federal';
						else if (this.definitions.tab == "#tab6") type = 'deputado-estadual';
					}
				} else {
					type = this.definitions.type;
				}
				
				if (type == "deputado-estadual" && this.definitions.stateName == "distrito-federal") type = 'deputado-distrital';

				if (this.definitions.tab == ""){
				
					if (this.definitions.stateName == "" && this.definitions.city == "") CURRENTNAMESPACE.HashDealer.clearLevels();
					else if (this.definitions.city == "")	CURRENTNAMESPACE.HashDealer.setLevels([this.definitions.stateName]);
					else CURRENTNAMESPACE.HashDealer.setLevels([this.definitions.stateName,this.definitions.city]);
		
				} else {
					if (type == "presidente"){
						
						if (this.definitions.tab == "#tab2"){
							
							if (this.definitions.stateName == "" && this.definitions.city == "") CURRENTNAMESPACE.HashDealer.setLevels(["turno2"]);
							else if (this.definitions.city == "")	CURRENTNAMESPACE.HashDealer.setLevels(["turno2",this.definitions.stateName]);
							else CURRENTNAMESPACE.HashDealer.setLevels(["turno2",this.definitions.stateName,this.definitions.city]);
						
						} else if (this.definitions.tab == "#tab3"){ 
						
							if (this.definitions.stateName == "" && this.definitions.city == "") CURRENTNAMESPACE.HashDealer.setLevels(["turno1"]);
							else if (this.definitions.city == "")	CURRENTNAMESPACE.HashDealer.setLevels(["turno1",this.definitions.stateName]);
							else CURRENTNAMESPACE.HashDealer.setLevels(["turno1",this.definitions.stateName,this.definitions.city]);
							
						}
						
					} else {
						
						if (this.definitions.stateName == "" && this.definitions.city == "") CURRENTNAMESPACE.HashDealer.setLevels([type]);
						else if (this.definitions.city == "")	CURRENTNAMESPACE.HashDealer.setLevels([type,this.definitions.stateName]);
						else CURRENTNAMESPACE.HashDealer.setLevels([type,this.definitions.stateName,this.definitions.city]);
						
					}
				}
				
				if (type == "governador2" || type == "governador1") type="governador";
				
				CURRENTNAMESPACE.controllerAcess.config(type, this.definitions.stateName,city,party,status,coalition);
				CURRENTNAMESPACE.controllerAcess.execute();
			},
			getInfoByParty: function(id){
				var valor = this.definitions.city ;
				var type = (this.definitions.tab == "#tab4")? 'deputado-federal' : 'deputado-estadual'; 
				var partyName = $("#"+id).find("a").html(); 
				
				if (id == "todos") id = 0;
				
				if (type == "deputado-estadual" && this.definitions.stateName == "distrito-federal") type = 'deputado-distrital';
								
				this.definitions.party = id;
				
				CURRENTNAMESPACE.controllerAcess.config(type, this.definitions.stateName, valor , id,this.definitions.status,'');
				CURRENTNAMESPACE.controllerAcess.execute();
				
				$(this.definitions.tab+" .mod-485 .coligation  .droplist-value div").html("todas as coliga&ccedil;&otilde;es");
				$(this.definitions.tab+" .mod-485 .coligation  li.selected").removeClass('selected');
				
				$(this.definitions.tab+" .mod-485 .coligation li").show();

				
				if (id != 0){
					var coalitionParties = null;
					var hiden = true;
					
					$(this.definitions.tab+" .mod-485 .coligation li").filter(function() {
						coalitionParties = $(this).find("a").html().split("/");
						
						for (var f=0; f<coalitionParties.length; f++){
							if ( coalitionParties[f].replace(/^\s+|\s+$/g,"") == partyName ) {
								hiden = false
								break;
							}
						}
						
						
						if (hiden && $(this).find("a").html() != "coligação") $(this).hide();
						hiden = true;
						
					});
				}
				
			},
			getInfoByStatus: function(id){
				var valor = this.definitions.city;
				var type = (this.definitions.tab == "#tab4")? 'deputado-federal' : 'deputado-estadual';
				var party = this.definitions.party != "" ? parseInt( this.definitions.party ) : 0;
				var coalition = this.definitions.coalition != "" ? parseInt( this.definitions.coalition) : '';
				
				if (party == "todos") party = 0;
				if (id == "status" || id == "todos") id = 0;
				if (type == "deputado-estadual" && this.definitions.stateName == "distrito-federal") type = 'deputado-distrital';
				
				this.definitions.status = id;
				
				CURRENTNAMESPACE.controllerAcess.config(type, this.definitions.stateName, valor, party, id, coalition);
				CURRENTNAMESPACE.controllerAcess.execute();
			},
			getInfoByCoalition: function(id){
				var valor = this.definitions.city;
				var type = (this.definitions.tab == "#tab4")? 'deputado-federal' : 'deputado-estadual';
				var coalitionParties = $("#"+id).find("a").html().split("/");
				var hiden = true;
				
				if (id == "coligacao" || id == "todas") id = 0;
				if (type == "deputado-estadual" && this.definitions.stateName == "distrito-federal") type = 'deputado-distrital';
								
				this.definitions.coalition = id;
				this.definitions.party = 0;
				
				CURRENTNAMESPACE.controllerAcess.config(type, this.definitions.stateName, valor, 0,this.definitions.status, id);
				CURRENTNAMESPACE.controllerAcess.execute();
				
				$(this.definitions.tab+" .mod-485 .party .droplist-value div").html("todos os partidos");
				$(this.definitions.tab+" .mod-485 .party li.selected").removeClass('selected');
				
				$(this.definitions.tab+" .mod-485 .party li").show();
				
				if (id != 0){
					$(this.definitions.tab+" .mod-485 .party li").filter(function() {
						for (var f=0; f<coalitionParties.length; f++){
							if ( $(this).find("a").html() == coalitionParties[f].replace(/^\s+|\s+$/g,"") ) {
								hiden = false
								break;
							}
						}
						
						
						if (hiden && $(this).find("a").html() != "partidos") $(this).hide();
						hiden = true;
						
					});
				}
			},


			events: function(){
				var container = $(this.definitions.tab+" .mod-484 .citySuggestion"); 
				var clearButton = $('a.clearCombo','.mod-484');
				var dropList = $(this.definitions.tab+" .mod-484  .sugestionList");
				var dropListHTML = dropList.html();
				
				$("body").bind("click", function(){
					$(".mod-484  .sugestionList").hide();
					if (container.val() == ""){
						container.val("Digite a cidade");
						clearButton.removeClass('show');
					}
					container.removeClass('selected');
					container.removeClass('active');
				});
				
				if (this.definitions.cityLabel != ""){
					container.val(this.definitions.cityLabel);
					$(this.definitions.tab+".mod-490-b h5").html(this.definitions.cityLabel);
				}

				container.unbind('focus');
				
				container.bind('click', function(evt){
						if ( window.event != undefined) window.event.cancelBubble=true; 
						else evt.stopPropagation(); 
						container.val("").addClass('active');
				});
				
				clearButton.click(function (evt){
					if ( window.event != undefined) window.event.cancelBubble=true; 
					else evt.stopPropagation();
					evt.preventDefault();
					
					var stateName = $(".mod-490-b h5");
					container.val("Digite a cidade");
					container.removeClass('selected');
					clearButton.removeClass('show');
					
					CURRENTNAMESPACE.filters.definitions.cityLabel = '';
					CURRENTNAMESPACE.filters.definitions.city = '';
					CURRENTNAMESPACE.filters.getInfoByCity();
				});
				container.keyup(function(event){
					if ( window.event != undefined) window.event.cancelBubble=true; 
					else event.stopPropagation();
					
					if (dropList.html() == null) dropList = $(".mod-484  .sugestionList");
					var list = dropList.find('li');
					var valor = this.value;
					var item = "";
					var itemContent = "";
					var itemContentTemp = ""; 
					
					if (event.keyCode == '13') {
						event.preventDefault();
						
						for (var i=0; i<list.length; i++){
							item = $(list[i]).find("a");
							itemContent = item.html();
							itemContentTemp = itemContent.replace(/á/gi,"a").replace(/ã/gi,"a").replace(/â/gi,"a");
							itemContentTemp = itemContentTemp.replace(/ó/gi,"o").replace(/ô/gi,"o").replace(/õ/gi,"o");
							itemContentTemp = itemContentTemp.replace(/é/gi,"e").replace(/ê/gi,"e");
							itemContentTemp = itemContentTemp.replace(/í/gi,"i").replace(/ú/gi,"u").replace(/ç/gi,"c");
							
							if ( itemContent.match( new RegExp(valor ,"gi")  ) || itemContentTemp.match( new RegExp(valor ,"gi")  ) ) {
								CURRENTNAMESPACE.filters.definitions.cityLabel = item.html();
								CURRENTNAMESPACE.filters.definitions.city = item.attr("href").split("#")[1];
								break;
							}
						}
						
						CURRENTNAMESPACE.filters.getInfoByCity();
						
						$(this).removeClass('active');
						$(this).addClass('selected');
						$('a.clearCombo','.mod-484').addClass('show');
						$(".mod-484  .sugestionList").hide();
						
					} else if (event.keyCode == '8') {
						if (valor != "") CURRENTNAMESPACE.controllerAcess.executeFilterState();
					} else {
						if (valor != "") CURRENTNAMESPACE.controllerAcess.executeFilterState();
					}
					
				});
			},
			
			setCombos: function(){
				var settings = {
						customScroll: true,
						height: 150
					}     
				// BY LIST
				$( CURRENTNAMESPACE.filters.definitions.tab + ' .mod-485 .droplist-by-list').droplist(settings, function() {
					var that = this;
					that.select.bind("click", function(evt){ evt.preventDefault() });
				 
					that.list.find('li').bind('click', function(evt) {
						evt.preventDefault();
						that.set(this);
						var obj = $(this).parents(".droplist-by-list");
						if (obj.hasClass("party"))	{
							CURRENTNAMESPACE.filters.getInfoByParty(this.id);
							that.list.find("li").show();
						} else if (obj.hasClass("status"))	CURRENTNAMESPACE.filters.getInfoByStatus($(this).find("a").attr("href"));
						else CURRENTNAMESPACE.filters.getInfoByCoalition(this.id);
						
						
						
						return false;
					});
				});
				
				
			}
		}
	
	
	
}).extend(function($, CONTEXT_DATA, TOOLS) {
	
	var CURRENT_NAMESPACE = this;
	var CONTROLLER = this.Controller;
	var CROSS_REFERENCE = this.CrossReference;
	
	//interface to acess controler
	
	
	
	this.controllerAcess = {
			
		globals:{
			
			serviceTitle: "",
			stateName: "",
			cityName: "",
			party: "",
			status: "",	
			coalition: ""
				
		},

		definitions:{
			turn:window.trrContextData ? window.trrContextData.turn : "1",
			tab: "#tab1",
			results: false,
			modInfo: "#mod-490-b",
			modDashboardGov: "#mod-482-gov",
			modDashboardSen: "#mod-482-sen",
			modDashboardDepF: "#dep-fed",
			modDashboardDepS: "#dep-est",
			tablesRequester: null,
			comboFiltersRequest: null,
			summaryRequester: null,
			filterStatesDetail:null,
			force:false
		},
		
		config:function( vServiceTitle, vStateName, vCityName, vParty, vStatus, vCoalition){
			
			if (vCityName == '') vCityName = "todas";
			if (vStatus == '') vStatus = 0;
			if (vParty == '') vParty = 0;
			
			
			this.globals.serviceTitle = vServiceTitle;
			this.globals.stateName = vStateName;
			this.globals.cityName = vCityName;
			this.globals.party = vParty;
			this.globals.status = vStatus;
			this.globals.coalition = vCoalition;
			
		},
		execute: function(){
			
			var objDefinitions = this.definitions;
			var objGlobals = this.globals;
			
			// re-style table headers
			// beto: there be dragons, giant dragons
			// therefore... run for your life!
			$('.mod-479').find('th').removeClass('asc').removeClass('desc').filter('.valid').addClass('desc');
			
			if (objDefinitions.tablesRequester && objDefinitions.tablesRequester.status != "ready"){
			
				objDefinitions.tablesRequester.setOptions( { 
					
					idTurn:     objDefinitions.turn,
					ufName:		objGlobals.stateName, 
					titleName:	objGlobals.serviceTitle,
					cityName:	objGlobals.cityName,
					idParty:	objGlobals.party,
					coalition:	objGlobals.coalition,
					status:		objGlobals.status,
					orderBy: 'totalvotes',
					order: 'desc'
					
				} );
				
				objDefinitions.tablesRequester.reload();
				
			} else {
			
				objDefinitions.tablesRequester = CONTROLLER.services
				.get('getDataByRole')
				.setOptions({
					idTurn:     objDefinitions.turn,
					ufName:		objGlobals.stateName,
					cityName:	objGlobals.cityName,
					titleName:	objGlobals.serviceTitle,
					idParty:	objGlobals.party,
					coalition:	objGlobals.coalition,
					status:		objGlobals.status,
					orderBy: 'totalvotes',
					order: 'desc'
				})
				.setProcedure(function(data, requestDetails){
					if(requestDetails.hasNewData){
						CURRENT_NAMESPACE.countignActions.governorTable(data, objDefinitions.tab + " .mod-479",objDefinitions.tab + " .mod-486",objDefinitions.tab + " .mod-487",objDefinitions.tab + " .mod-488", objDefinitions.tab + " .mod-490-b");
						//CURRENT_NAMESPACE.controllerAcess.showTab();
						
						if (objDefinitions.results) objDefinitions.tablesRequester.stop();
					}
				}).start(this.definitions.force);	
			}
			
		},
		
		showTab: function(){
			if (this.definitions.force) $(this.definitions.tab).css("visibility","visible");
		},
		
		executeFilter: function(){
			
			var objDefinitions = this.definitions;
			var objGlobals = this.globals;
			
			if (objDefinitions.comboFiltersRequest){
				objDefinitions.comboFiltersRequest.setOptions( { ufName:objGlobals.stateName, titleName:objGlobals.serviceTitle } );
				objDefinitions.comboFiltersRequest.setReloadInterval(0).start();
			} else {
				objDefinitions.comboFiltersRequest = CONTROLLER.services
				.get('getPartiesDetails')
				.setOptions({
					ufName:		objGlobals.stateName,
					titleName:	'deputado-federal'
				})
				.setProcedure(function(data, requestDetails){
					if(requestDetails.hasNewData){
						CURRENT_NAMESPACE.countignActions.buildComboFilters(data, objDefinitions.tab + " .mod-485");
						CURRENT_NAMESPACE.filters.setCombos();
					}
					
				}).setReloadInterval(0).start();
			}
			
		},
		
		executeResume: function(){
			var objDefinitions = this.definitions;
			var objGlobals = this.globals;
			
			if (objDefinitions.summaryRequester && objDefinitions.summaryRequester.status != "ready"){
				objDefinitions.summaryRequester.setOptions( { ufName:objGlobals.stateName } );
				objDefinitions.summaryRequester.reload();
			} else {
				objDefinitions.summaryRequester = CONTROLLER.services
				.get('getStateSummary')
				.setOptions({
					ufName:objGlobals.stateName
				})
				.setProcedure(function(data, requestDetails){
					if(requestDetails.hasNewData){
						var votes = parseInt(data.status.REFINEDTOTALS.split('(')[0], 10);
						
						CURRENT_NAMESPACE.countignActions.governorDashboard(data,objDefinitions.modDashboardGov, objDefinitions.modInfo);
						CURRENT_NAMESPACE.countignActions.senDashboard(data,objDefinitions.modDashboardSen, objDefinitions.modInfo);
						
						if (votes > 0){
							CURRENT_NAMESPACE.countignActions.depDashboard(data.deputies.federal,objDefinitions.modDashboardDepF);
							CURRENT_NAMESPACE.countignActions.depDashboard(data.deputies.state,objDefinitions.modDashboardDepS);
						}
						
						CURRENT_NAMESPACE.controllerAcess.showTab();
						
						if (objDefinitions.results) objDefinitions.summaryRequester.stop();
					} 
				}).start(this.definitions.force);
			}
			
		},
		executeFilterState: function(){
			var objDefinitions = this.definitions;
			var objGlobals = this.globals;
			
			if (objDefinitions.filterStatesDetail){
				CURRENT_NAMESPACE.countignActions.buildFilters(objDefinitions.filterStatesDetail,objDefinitions.tab + " .mod-484");
			} else {
				objDefinitions.filterStatesDetail = CROSS_REFERENCE.getStateDetails(objGlobals.stateName, function(data){
					CURRENT_NAMESPACE.countignActions.buildFilters(data,objDefinitions.tab + " .mod-484");
				});
			}
		},
		
		stop: function(type){
			var objDefinitions = this.definitions;
			var objGlobals = this.globals;
			
			if (type == "summary" && objDefinitions.summaryRequester) objDefinitions.summaryRequester.stop();
			if (type == "databyrow"  && objDefinitions.tablesRequester) objDefinitions.tablesRequester.stop();
			if (type == "combo"  && objDefinitions.comboFiltersRequest) objDefinitions.comboFiltersRequest.stop();
		}
	}
	
}).extend(function($, CONTEXT_DATA, TOOLS) {
	TOOLS.log.checkpoint('Disponibilizando comportamento para o módulo 076 (toolbar)');

	var ELECTIONS_2010 = this,
		EDITORIAL_SETTINGS = this.editorialSettings;

	this.mod076 = (function() {
		var CONSTANTS;

		return function(options) {
			if (!CONSTANTS) {
				CONSTANTS = {
					defaultOptons:{
						struct:{
							containersSelector:String,
							setStartPageTriggerSelector:String,
							showLinkTriggerSelector:String,
							showLinkActiveClassName:String,
							orkutTriggerSelector:String,
							facebookTriggerSelector:String,
							twitterTriggerSelector:String
						},
						values:{
							containersSelector:'.mod-076',
							setStartPageTriggerSelector:'a.set-page-default, a.page-default',
							startPageOnClassName:"page-default",
							startPageOffClassName:"set-page-default",
							showLinkTriggerSelector:'a.show-link, a.show-link-active',
							showLinkActiveClassName:'show-link-active',
							orkutTriggerSelector:'a.icn-orkut',
							facebookTriggerSelector:'a.icn-facebook',
							twitterTriggerSelector:'a.icn-twitter'
						}
					},
					cookieOptions:{
						name:'trr-elections-2010-startpage',
						path:(function() {
							var cookiePathExp = new RegExp('(.+'+document.domain+')(\/.*(apuracao|elections)\/?)'),
								splittedLocation = cookiePathExp.exec(location.href),
								path = (splittedLocation && splittedLocation[2]) ? splittedLocation[2] : undefined;

							if (!path) {
								path = '/';
								TOOLS.log.warning('Não foi possível identificar o diretório base para vincular o cookie. O valor foi definido como a raiz do domínio atual.')
							}

							return path;
						})()
					},
					Dom:new function(){
						var SELF = this,
							currentOptions,
							$elements = this.$elements = {};

						this.setOptions = function (options) {
							$elements.containers = $(options.containersSelector);
							if (!$elements.containers.length) {
								TOOLS.log.critical("Não foi possível encontrar elementos containers para o módulo 076 (toolbar)  com seletor especificado > " + options.containersSelector);
								return;
							}

							$elements.triggers = {
								startPage:$elements.containers.find(options.setStartPageTriggerSelector)
							};

							currentOptions = options;

							return true;
						};

						this.handlers = {
							startPage:{
								set:function () {
									$elements.triggers.startPage.attr('class', currentOptions.startPageOnClassName);
								},
								unset:function () {
									$elements.triggers.startPage.attr('class', currentOptions.startPageOffClassName);
								}
							}
						};
					},
					Commands:{
						startPage:new function() {
							var SELF = this,
								active = false;

							this.check = function() {
								var previousStartupPage = TOOLS.cookie.read(CONSTANTS.cookieOptions.name);
								if (previousStartupPage && decodeURIComponent(previousStartupPage) == location.href) {
									CONSTANTS.Dom.handlers.startPage.set();
									active = true;
								} else {
									CONSTANTS.Dom.handlers.startPage.unset();
									active = false;
								}
							};

							this.set = function() {
								var cookieOptions = CONSTANTS.cookieOptions,
									previousStartupPage = TOOLS.cookie.read(cookieOptions.name);

								if (previousStartupPage && decodeURIComponent(previousStartupPage) != location.href) {
									TOOLS.log.warning('Desativando configuração anterior de página inicial: \n' + previousStartupPage);
									TOOLS.cookie.erase(cookieOptions.name, cookieOptions.path);
								}

								TOOLS.log.checkpoint('Configurando página inicial como: \n' + location.href);
								var hoursLeftToExpire = Number.prototype.toFixed.call((EDITORIAL_SETTINGS.secondTurnStartDate - new Date()) / (1000 * 60 * 60), 2);
								if (!hoursLeftToExpire || hoursLeftToExpire <= 0) {
									hoursLeftToExpire = 10 * 365 * 24; // 10 anos
								}
								TOOLS.cookie.create(cookieOptions.name, location.href, hoursLeftToExpire, cookieOptions.path);
								
								TOOLS.cookie.create('trr-elections-2010-counting-session', location.href, null, cookieOptions.path);

								CONSTANTS.Dom.handlers.startPage.set();

								active = true;
							};

							this.unset = function() {
								TOOLS.log.warning('Desativando configuração anterior de página inicial');
								TOOLS.cookie.erase(CONSTANTS.cookieOptions.name);
								TOOLS.cookie.erase(CONSTANTS.cookieOptions.name, CONSTANTS.cookieOptions.path);

								CONSTANTS.Dom.handlers.startPage.unset();

								active = false;
							};

							this.toggle = function() {
								if(!active) {
									SELF.set();
								} else {
									SELF.unset();
								}
							};
						},
						linkLayer:new function() {
							var SELF = this,
								active = false,
								currentLink,
								LAYER_TPL = ''+
									'<div class="trr-layer" style="{styleAttribute}">'+
										'<a href="#" class="btn-close">fechar</a>'+
										'<p class="instructions">'+
											'Copie o <strong>link</strong> abaixo:'+
										'</p>'+
										//'<input type="text" value="{currentLink}" />'+
										'<p class="url">'+
											'{currentLink}'+
										'</p>'+
									'</div>';

							var updateLayer = function ($trigger) {
								var styleValue = 'position:absolute; top:'+($trigger.height() + 7)+'px',
									HTML = TOOLS.parseTPL({currentLink:currentLink, styleAttribute:styleValue}, LAYER_TPL),
									$layer;

								if (!$trigger.data('hasLayer')) {
									$layer = $(HTML).appendTo($trigger.parent());
								} else {
									$trigger.parent().find('.trr-layer:first').replaceWith(HTML);
									$layer = $trigger.parent().find('.trr-layer:first');
								}

								var leftPosition = $trigger.position().left - $layer.outerWidth(true) + $trigger.outerWidth(true);
								if ($('#trr-ctn-general').offset().left > ($trigger.offset().left - $layer.outerWidth(true) + $trigger.outerWidth(true))) {
									leftPosition = '0';
								}
								$layer.css('left', leftPosition+'px');

								$trigger.data('hasLayer', true);

								$layer.css('width', $layer.width());
							};

							this.check = function () {
								currentLink = location.href;

								if (active) {
									SELF.close();
								}
							};

							this.open = function ($trigger) {
								if (currentLink != location.href) {
									SELF.check();
								}

								updateLayer($trigger);

								$trigger.parent().parent().addClass('stt-showlink');

								TOOLS.log.checkpoint('Exibindo link atual');
								active = true;
							};

							this.close = function () {
								TOOLS.log.checkpoint('Ocultando link atual');

								CONSTANTS.Dom.$elements.containers.removeClass('stt-showlink');
								active = false;
							};

							this.toggle = function ($trigger) {
								if(!active) {
									SELF.open($trigger);
								} else {
									SELF.close();
								}
							}
						}(),
						sharer: new function () {
							var SELF = this,
								pageDetails, networks;

							var getRequestUrl = function (socialMediaConfigsOBJ, forceNewParams) {
								if (typeof forceNewParams == 'object') {
									socialMediaConfigsOBJ.params = $.extend(socialMediaConfigsOBJ.params, forceNewParams);
								}

								var url = socialMediaConfigsOBJ.wsBaseUrl;
								for (var currentParamName in socialMediaConfigsOBJ.params) {
									url += (url.indexOf('?') == -1) ? '?' : '&';
									url += currentParamName + '=' + socialMediaConfigsOBJ.params[currentParamName];
								}

								return url;
							};

							this.check = function () {
								pageDetails = {
									url:TOOLS.encodeURIComponent(location.href),
									title:TOOLS.encodeURIComponent(document.title),
									summary:(EDITORIAL_SETTINGS && EDITORIAL_SETTINGS.stage == 'results') ? 'Veja os resultados das Eleições para presidente, governadores, senadores e deputados de todos os Estados.' : $('meta[name=description]').attr('content') || '',
									shortUrl:''
								};

								networks = {
									facebook:{
										label:"Facebook",
										wsBaseUrl:"http://www.facebook.com/share.php",
										params:{
											u:pageDetails.url,
											t:pageDetails.summary
										}
									},
									orkut:{
										label:"Orkut",
										wsBaseUrl:"http://promote.orkut.com/preview",
										params:{
											nt:"orkut.com",
											du:pageDetails.url,
											tt:pageDetails.title,
											cn:pageDetails.summary,
											tn:'http://s1.trrsf.com.br/atm/3/core/_img/ico-terra-70x50.png'// A thumbnail image to be included in the shared item.
										}
									},
									twitter:{
										label:"Twitter",
										wsBaseUrl:"http://twitter.com/home",
										params:{
											status:pageDetails.title + ' - ' + TOOLS.encodeURIComponent(' (via @terra_eleicoes) #eleicoes2010')
										}
									}
								};
							};


							this.trigger =  function (networkName) {
								if (!pageDetails) {
									SELF.check();
								}

								if (networkName == 'twitter' && !pageDetails.shortUrl) {
									TOOLS.getShortUrl(
										'bitLy',
										location.href,
										null,
										function (shortUrl) {
											pageDetails.shortUrl = shortUrl;											

											var statusText = (EDITORIAL_SETTINGS && EDITORIAL_SETTINGS.stage == 'counting') ? 'Acompanhe agora no Terra a apuração de votos' : "Confira o resultado das eleições";
												statusText += (EDITORIAL_SETTINGS && EDITORIAL_SETTINGS.type == 'state') ? ' - ' + /: ((\s?[\wÀ-ú]*)*) -/.exec(decodeURIComponent(pageDetails.title))[1] : ' em todo Brasil'; 

											var url = getRequestUrl(networks[networkName], {status:TOOLS.encodeURIComponent(statusText + ' - ' + decodeURIComponent(shortUrl) + ' (via @terra_eleicoes) #eleicoes2010')});
											window.open(url, 'trrShareBy');											
										}
									);

								} else {
									var url = getRequestUrl(networks[networkName]);
									window.open(url, 'trrShareBy');
								}
								TOOLS.log.checkpoint('Compartilhando conteúdo via <strong>'+networkName+'</strong>');
							};
						}
					}
				};
			}

			// validate options struct
			options = $.extend(CONSTANTS.defaultOptons.values, options || {});
			var structErrors = TOOLS.getStructErrors({
				data:options,
				model:CONSTANTS.defaultOptons.struct
			});
			if (structErrors) {
				TOOLS.log.critical("Erro ao validar parâmetros para o módulo 076 (toolbar) > " + structErrors);
				return;
			}

			TOOLS.log.checkpoint('Instanciando o módulo toolbar (076) para o seletor ' + options.containersSelector);

			// get interface elements
			var Dom = CONSTANTS.Dom;

			if(!Dom.setOptions(options)) {
				return;
			};

			var Commands = CONSTANTS.Commands,
				$elements = Dom.$elements;

			// check defaultStartPage
			Commands.startPage.check();

			// EVENTS >>
			ELECTIONS_2010.HashDealer.onChange(function () {
				Commands.startPage.check();
				Commands.linkLayer.check();
				Commands.sharer.check();
			});

			// dom
			$elements.containers.each(function(i) {
				$(this).click(function(evt) {
					if (evt.target.href) {
						var $target = $(evt.target);

						if ($target.is(options.setStartPageTriggerSelector)) {
							Commands.startPage.toggle();
						} else if ($target.is(options.showLinkTriggerSelector)) {
							TOOLS.log.checkpoint('Disparando showlink');
							Commands.linkLayer.toggle($target);
						} else if ($target.is(options.orkutTriggerSelector)) {
							Commands.sharer.trigger('orkut');
						} else if ($target.is(options.facebookTriggerSelector)) {
							Commands.sharer.trigger('facebook');
						} else if ($target.is(options.twitterTriggerSelector)) {
							Commands.sharer.trigger('twitter');
						} else if ($target.is('a.btn-close')) {
							Commands.linkLayer.close();
						} else {
							return true;
						}

						evt.preventDefault();
					}
				});
			});
		};
	})();
	

	

});
