/*-
 * Copyright (c) 2005, CESAR (opensource@cesar.org.br)
 * Rua Bione, 220, Cais do Apolo, Bairro do Recife Antigo - Recife-PE
 * CEP 50030-390, BRASIL
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  */

var MenuController = {
	showMenu: function() {}
}

function changeHrefInAction() {
	var links = document.getElementsByTagName('a');

	for (var i = 0; i < links.length; i++) {
		if (links[i].onclick != null && links[i].className.indexOf('forceAnchor') < 0) {
			var action = links[i].onclick + '';
			action = action.replace('function onclick(event)', '');
			action = action.replace('function ()', '');
			action = action.replace('function()', '');
			action = action.replace('{', '');
			action = action.replace('}', '');
			links[i].href = 'javascript:void(0)';
		}
	} 
}

function showOnlyNumbers(input) {
	var value = input.value;

	value = value.replace(/\D/g, "");

	input.value = value;

	return value;
}

/*
 * get a string with the friendly size
 */
function getFriendlySize(size) {
	var fSize;

	if (size > 1024000) {
		fSize = round(size/1024/1024, 2) + 'Mb';
	} else if (size > 1024) {
		fSize = round(size/1024, 2) + 'Kb';
	} else {
		fSize = size + 'b';
	}

	return fSize;
}

/**
 * define the decimal quantitative
 */
function round(value, decimalDigits) {
	var sValue = value + '';
	var pos = sValue.indexOf('.', 0);

	if (pos > -1) {
		sValue = sValue.substring(0,pos) + sValue.substring(pos,pos+decimalDigits+1);
	}

	return sValue;
}


function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];

	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");

	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className))a.push(els[i]);
	return a;
}

function cleanAscii(text) {
	var removedText = text;
	removedText = removedText.replace(/&\w{1,};/g,'');
	
	return removedText;
}

function cleanTags(text) {
	var removedText = text;
	removedText = removedText.replace(/<\w{1,}>/g,'');
	removedText = removedText.replace(/<\/\w{1,}>/g,'');
	removedText = removedText.replace(/<\w{1,}\/>/g,'');
	
	return removedText;
}
 

/**
 * put a topic as read
 */
function setTopicAsRead(topicId){
	ForumDwrAction.setTopicCommunityAsRead(topicId, {callback:function(){},errorHandler:function(){}});
}

/**
 *	slide up or down a element
 *	this function using jquery
 */
function slideElement(element, show) {
	var isShow = false;
	if (show || (element.style && element.style.display.indexOf('none') > -1 && show == null)) {
		isShow = true;
		$(element).slideDown('fast');
	} else {
		$(element).slideUp('fast');
	}
	
	return isShow;
}

/**
 * fade in or out a element
 * this function using jquery
 */
function fadeElement(element, show) {
	if (show || (element.style && element.style.display.indexOf('none') > -1 && show == null)) {
		$(element).fadeIn('fast');
	} else {
		$(element).fadeOut('fast');
	}
}

/**
 *	unserialize the String to JSON
 */
function unserialize(object) {
	return eval('('+object+')');
}

function selectMarketOfferSubMenu(type) {
	document.getElementById(type).className += 'selec';
}

function replaceNameInElement(element, firstReplace, secoundReplace) {
	var name = element.innerHTML;
	
	if (name.toLowerCase().indexOf(firstReplace.toLowerCase()) > -1) {
		name = name.toLowerCase().replace(firstReplace.toLowerCase(), secoundReplace.toLowerCase());
	} else {
		name = name.toLowerCase().replace(secoundReplace.toLowerCase(), firstReplace.toLowerCase());
	}
	
	element.innerHTML = name;
}


function createPositionsPage(object) {
	var div = document.createElement('div');
	
	if (object != null && object.entities.length > 0 ) {
		var pos = ((object.currentPage - 1) * object.size) + 1;
		var size = pos - 1 + object.entities.length;
		var max = object.maxSize;
		div.innerHTML = pos + '-' + size + ' / ' + max;
	}
	
	return div;
}

function replaceImg(element, firstSrc, secoundSrc) {
	var src = element.src;
	
	if (src.toLowerCase().indexOf(firstSrc.toLowerCase()) > -1) {
		element.src = secoundSrc;
	} else {
		element.src = firstSrc;
	}
}

/**
 *	function that control the description fade
 */
function viewMoreComponent(idName, id){
	var viewDesc = document.getElementById(idName + "_viewMoreDescription_"+id);	
	var aElement = document.getElementById(idName + "_viewMore_" + id);
	replaceNameInElement(aElement, ' +', ' -');
	slideElement(viewDesc);
}

function viewComponent(idName, id, firstText, secoundText){
	var viewDesc = document.getElementById(idName + "_viewMoreDescription_"+id);	
	var aElement = document.getElementById(idName + "_viewMore_" + id);
	replaceNameInElement(aElement, firstText, secoundText);
	slideElement(viewDesc);
}

function globalConfirm(message, link) {
	if (confirm(message)) {
		document.location = link;
	}
}

/*------ RATE -------*/
var RATES = new Array();

function getRateFromId(id) {
	return RATES[id];
}
 
function removeRateFromId(id) {
	delete RATES[id];
} 

function rate(vlRate, objectCode, id){
	getRateFromId(id).rate(vlRate, objectCode);
}

function Rate(id, rateFunction, averageFunction) {
	this.id = id;
	this.rateFunction = rateFunction;
	this.averageFunction = averageFunction;
	this.Rate = this;
	RATES[id] = this;
	
	this.rate = function(vlRate, objectCode) {
		var Rate = this.Rate;
		
		this.Rate.setLoaderImage('rateDiv_' + Rate.id);
		this.rateFunction(vlRate, objectCode, {
			callback: function(value) {
				Rate.updateIcons(value, objectCode, Rate)
			},
			errorHandler: function() {
				this.Rate = Rate;
				Rate.rate(vlRate, objectCode);
			}
		});
	}
	
	this.updateIcons = function(value, objectCode, Rate) {
		var imgSelected = "<img src=\"images/icon_star.png\" border=\"0\">";
		var imgUnselect = "<img src=\"images/icon_star_unselect.png\" border=\"0\">";
		
		var rateDivId = 'rateDiv_' + Rate.id;
		var mainRateDivId = 'mainRateDiv_' + Rate.id;
		
		var rateDiv = document.getElementById(rateDivId);
		var mainDiv = document.getElementById(mainRateDivId);
		
		mainDiv.removeChild(rateDiv);
		var newdiv = document.createElement('span');
		newdiv.setAttribute('id', rateDivId);
		
		for (var i = 0; i < value; i++){
			var newImg = Rate.createStars("images/icon_star.png", true, i, objectCode);
			newdiv.appendChild(newImg);
		}

		for (var i = value; i < 5; i++){
			var newImg = Rate.createStars("images/icon_star_unselect.png", true, i, objectCode);
			newdiv.appendChild(newImg);
		}								
		
		mainDiv.appendChild(newdiv);
		
		Rate.setLoaderImage('evalDiv_' + Rate.id);
		Rate.averageFunction(objectCode, function(object) {
			Rate.updateEvaluationDiv(object, Rate);
		});
	}
	
	this.updateEvaluationDiv = function(average, Rate) {
		var evalDivId = 'evalDiv_' + Rate.id;
		var mainEvalDivId = 'mainEvalDiv_' + Rate.id;
		
		var evalDiv = document.getElementById(evalDivId);
		var mainDivEval = document.getElementById(mainEvalDivId);
		
		if (mainDivEval && evalDiv) {
			mainDivEval.removeChild(evalDiv);
			var newdiv = document.createElement('span');
			newdiv.setAttribute('id', evalDivId);
	
			for(i=0; i < average; i++){
				var newImg = Rate.createStars("images/icon_star.png", false, i);
				newdiv.appendChild(newImg);
			}
	
			for(i=average; i < 5; i++){
				var newImg = Rate.createStars("images/icon_star_unselect.png", false, i);
				newdiv.appendChild(newImg);
			}
	
			mainDivEval.appendChild(newdiv);
		}
	}
	
	this.setLoaderImage = function(id) {
		document.getElementById(id).innerHTML = '<img alt="load" src="images/bar-loader.gif"></img>';
	}
	
	this.createStars = function(img, onClick, value, objectCode){
		var newImg = document.createElement('img');
		newImg.setAttribute('src', img);
		newImg.setAttribute('border', "0");
		newImg.setAttribute('alt', value+1);
		newImg.setAttribute('title', value+1);

		if(onClick){
			++value;
			newImg.onclick = new Function('rate(' + value + ', ' + objectCode + ', "' + this.Rate.id + '")'); 
			newImg.style.cursor = "pointer";
		}

		return newImg;
	}
}

/** ORDER FILTER **/
function OrderFilter(id) {
	this.filterDown = true;
	this.elementSelected = null;
	this.elements = new Array();
	this.doBeforeExecute;
	this.doAfterExecute;
	this.id = id;
	
	this.upImage = 'images/ic_setaCima.png';
	this.downImage = 'images/ic_setaBaixo.png';
	
	this.addElement = function(element, value) {
		this.elements[this.elements.length] = element;
		element.filterValue = value;
	}
	
	this.build = function() {
		var current = this;
		
		if (this.elementSelected == null && this.elements.length > 0) {
			this.elementSelected = this.elements[0];
		}
		
		for (var i = 0; i < this.elements.length; i++) {
			this.elements[i].className += ' dft_hdr_st';
			this.elements[i].onclick = function() {
				current.clickElement(this);
			};
		}
		
		this.createArrow();
	}
	
	this.clickElement = function(element) {
		this.executeDoBeforeExecute();
		this.changeArrow(element);
		this.executeDoAfterExecute();
	}
	
	this.executeDoBeforeExecute = function() {
		if (this.doBeforeExecute) {
			this.doBeforeExecute(this);
		}
	}
	
	this.executeDoAfterExecute = function() {
		if (this.doAfterExecute) {
			this.doAfterExecute(this);
		}
	}
	
	this.changeArrow = function(element) {
		if (this.elementSelected == element) {
			this.filterDown = !this.filterDown;
		} else {
			this.elementSelected = element;
			this.filterDown = true;
		}
		
		this.createArrow();
	}
	
	this.createArrow = function() {
		var src = this.filterDown?this.downImage:this.upImage;
		var arrow = document.getElementById(this.id + "_Arrow");
		
		if (arrow) {
			arrow.parentNode.removeChild(arrow);
		}
		
		var img = '&nbsp;<img id="' + this.id + '_Arrow" src="' + src + '" style="display: none"></img>';
		$(img).appendTo(this.elementSelected);
		
		arrow = document.getElementById(this.id + "_Arrow");
		fadeElement(arrow);
	}
}



/** FAVORITE **/
function ChangeFavorite(objectCode, executeFunction) {
	this.selectImg = 'images/icon_star_g.png';
	this.unselectImg = 'images/icon_star_unselect_g.png';
	this.loadImg = 'images/loading_azul.gif';
	this.element;
	this.objectCode = objectCode;
	this.executeFunction = executeFunction;
	this.doBeforeChange;
	this.doAfterChange;

	this.setElement = function(element, value) {
		if (element != null) {
			if (value == null) {
				value = true;
			}
			
			this.element = element;
			
			var change = this;
			
			change.createImage(change, value);
			element.onclick = function() {
				change.execute(!value);
			}
		}
	}

	this.change = function(value) {
		this.executeDoBeforeChange();
		this.execute(value);
		this.executeDoAfterChange();
	}
	
	this.execute = function(value) {
		var change = this;
		var oldImg = change.element.src;
		
		this.load(change.element);
		this.executeFunction(this.objectCode, value, {
			callback: function(object){
				change.createImage(change, object);
			},
			
			errorHandler: function(){change.element.src = oldImg;}
		});
	}
	
	this.load = function(element) {
		element.src = this.loadImg;
	}
	
	this.executeDoBeforeChange = function() {
		if (this.doBeforeChange) {
			this.doBeforeChange(this);
		}
	}
	
	this.executeDoAfterChange = function() {
		if (this.doAfterChange) {
			this.doAfterChange(this);
		}
	}
	
	this.createImage = function(change, value) {
		if (value) {
			change.element.src = change.selectImg;
			change.element.onclick = function(){change.change(false);}
		} else {
			change.element.src = change.unselectImg;
			change.element.onclick = function(){change.change(true);}
		}
	}
}

function TyneManager() {
	this.instances = new Array();
	
	this.start = function(id) {
		if (this.instances[id] == null) {
			tinyMCE.execCommand('mceAddControl', true, id);
			this.instances[id] = true;
		}
	}
	
	this.stop = function(id) {
		if (this.instances[id] != null) {
			tinyMCE.execCommand('mceRemoveControl', true, id);
			delete this.instances[id];
		}
	}
	
	this.save = function() {
		tinyMCE.triggerSave();
	}
}

function ChangeElements() {
	this.selectClass = 'slct';
	this.elements = new Array();
	this.selectedElement;
	
	this.start = function() {
		var elements = $('.changeElement');
		
		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			this.addElement(element, this.getValueInElementClass(element));
			if (!this.selectedElement && element.className.indexOf(this.selectClass) > -1) {
				this.selectElement(element);
			}
		}
	}
	
	this.selectElement = function(element) {
		if (this.selectedElement) {
			var reg = new RegExp('(' + this.selectClass + ')', 'g');
			this.selectedElement.className = this.selectedElement.className.replace(reg, '');
		}
		
		element.className += ' ' + this.selectClass;
		this.selectedElement = element;
	}
	
	this.addElement = function(currentElement, currentValue) {
		var element = {element: currentElement, value: currentValue};
		this.elements[this.elements.length] = element;
		this.addFunction(element);
	}
	
	this.addFunction = function(element) {
		var fn = element.element.onclick;
		var ChangeElements = this;
		element.element.onclick = function() {
			ChangeElements.executedoBeforeExecute(element);
			
			if (fn) {
				fn(arguments);
			}
			
			ChangeElements.selectElement(element.element);
			ChangeElements.executedoAfterExecute(element)
		}
	}
	
	this.getValueInElementClass = function(element) {
		var value;
		var splitClass = element.className.split(' ');
		for (var i = 0; i < splitClass.length; i++) {
			var text = splitClass[i];
			if (text.indexOf('value:') > -1) {
				value = text.substring(6);
				break;
			}
		}
		
		return value;
	}
	
	/*
	 *	execute the doAfterExecute
	 */
	this.executedoAfterExecute = function(data) {
		if (this.doAfterExecute) {
			this.doAfterExecute(data, this);
		}
	}
	
	/*
	 *	execute the doBeforeExecute
	 */
	this.executedoBeforeExecute = function(data) {
		if (this.doBeforeExecute) {
			this.doBeforeExecute(data, this);
		}
	}
}

function cleanHTML(text) {
	var newText = text.replace(/<\/?[^>]+(>|$)/g, " ");
	return newText;
}

function showMaxText(text, max) {
	var newText = cleanHTML(text);
	
	if (max == null) {
		max = 100;
	}
	
	if (newText.length > max + 3) {
		newText = newText.substring(0, max) + '...';
	}
	
	return newText;
}



function getCookie(name){
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	var cookieValue = null;
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' '){
			c = c.substring(1,c.length);
		}
		if (c.indexOf(nameEQ) == 0){
			cookieValue = c.substring(nameEQ.length,c.length);
		}
	}
	return cookieValue;
}

function removeCookie(name){
	var date = new Date();
	date.setTime(date.getTime() + (-1*24*60*60*1000));
	document.cookie = name + "=''" + "; expires=" + date.toUTCString() + "; path=/";
}

function cookieContainsValue(value, cookie){
	var exists = false;
	if(cookie){
		var arrayValues = cookie.split(",");
		for(i=0; i < arrayValues.length; i++){
			var v = arrayValues[i];
			if(v.indexOf(value) == 0){
				exists = true;
				break;
			}
		}
	}
	return exists;
}

function removeFromCookie(cookieName, valueToBeRemoved){
	var cookie = getCookie(cookieName);
	if(cookie != null){
		if(cookie.toString() == valueToBeRemoved.toString()){
			removeCookie(cookieName);
		}else{
			if(cookie.indexOf(valueToBeRemoved + ",") >= 0){
				cookie = cookie.replace(valueToBeRemoved+",", "");
			}else{
				cookie = cookie.replace(","+valueToBeRemoved, "");
			}
			document.cookie = cookieName + "=" + cookie + ";path=/";
		}
	}
}

function setCookie(cookieName, value, expirationTime){
	var actualValue = getCookie(cookieName);
	if(actualValue != null){
		var exists = cookieContainsValue(value, actualValue);
		if(!exists){
			actualValue += "," + value;
		}
	}else{
		actualValue = value;
	}
	
	updateCookie(cookieName, actualValue, expirationTime);
}

function updateCookie(cookieName, value, expirationTime){
	document.cookie = cookieName + "=" + value + ";path=/";
}

/**
 * masks
 */
var Masks = {
	integer: function(element) {
		element.value = element.value.replace(/\D/g, '');
	},
	
	date: function(element) {
		var value = element.value;
		value = value.replace(/\D/g, "");
		value = value.replace(/(\d{2})(\d)/, "$1/$2");
		value = value.replace(/(\d{2})(\d{1,4})/, "$1/$2");
		
		element.value = value;	
	},
	
	time: function(element) {
		var value = element.value;
		if (value.match(/\d{1}:\d{2}/) && value.length == 4) {
			value = '0' + value;
		}
		
		value = value.replace(/\D/g, "");
		value = value.replace(/(\d{2})(\d)/, "$1:$2");
		
		element.value = value;
	}
}


// inclusaoo dos scripts para a nova interface

var Ajax = {
	requests: new Array(),
	requestsDate: new Array(),
	cleaning: false,
	
	init: function() {
		Ajax.abortAll();
	},
	
	load: function(ajaxArgs, id) {
		if (Ajax.requests[id]) {
			Ajax._abort(id);
		}
		
		Ajax._load(ajaxArgs, id);
	},
	
	_load: function(ajaxArgs, id) {
		var oldSuccess = ajaxArgs.success;
		var oldError = ajaxArgs.error;
		var date = new Date();
		Ajax.requestsDate[id] = date;
		
		ajaxArgs.success = function() {
			if (!Ajax.cleaning) {
				var requetsDate = Ajax.requestsDate[id];
				if (requetsDate != null && (date.getTime() == requetsDate.getTime())) {
					delete Ajax.requests[id];
					
					if (oldSuccess) {
						oldSuccess.apply(this, arguments);
					}
				}
			}
		};
		
		ajaxArgs.error = function() {
			if (!Ajax.cleaning) {
				var requetsDate = Ajax.requestsDate[id];
				if (requetsDate != null && (date.getTime() == requetsDate.getTime())) {
					delete Ajax.requests[id];
					
					if (oldError) {
						oldError.apply(this, arguments);
					}
				}
			}
		};
		
		Ajax.requests[id] = $.ajax(ajaxArgs);
	},
	
	abortAll: function() {
		Ajax.cleaning = true;
		for (var name in Ajax.requests.length) {
			Ajax._abort[name];
		}
		
		Ajax.requests = new Array();
		Ajax.requestsDate = new Array();
		
		Ajax.cleaning = false;
	},
	
	_abort: function(name) {
		var connection = Ajax.requests[name];
		
		if (connection) {
			connection.abort();
		}
	}
}

/**
 * 
 * @return
 */
function getAjaxArgs(datataipe) { //para melhor entendimento :)
	var _args = {
		url: null,
		type: 'POST',
		dataType: datataipe,
		ifModified: null,
		timeout: null,
		global: null,
		beforeSend: null,
		error: showErrorMessage,
		success: null,
		complete: null,
		data: null,
		processData: false,
		contentType: 'application/x-www-form-urlencoded; charset=utf-8',
		async: true
	}
	
	return _args;
}

/**
 * 
 * @param url
 * @return
 */
function getPageAjax(url, successCallback, dataType, parameters, errorCallback) {
	var args = getAjaxArgs(dataType);
	args.url = url;

	if (parameters != undefined) {
		args.data = parameters;
	}
	
	args.success = successCallback;
	
	if (errorCallback) {
		args.error = errorCallback;
	}
	
	Ajax.load(args, url);
}

function showErrorMessage(request) {
	//alert(request.responseText);
}

function getJSONFormOptions(successCallback, errorCallback) {
	var options = { 
	        success:  successCallback,  // post-submit callback 
	  		dataType: 'json',
	        clearForm:	true,        // clear all form fields after successful submit 
	        resetForm:	true,        // reset the form after successful submit
	        error: errorCallback,
	        contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
	    };
	return options;
}

function getNotJSONFormOptions(successCallback, errorCallback) {
	var options = { 
	        success:  successCallback,  // post-submit callback 
	  		dataType: null,
	        clearForm:	true,        // clear all form fields after successful submit 
	        resetForm:	true,        // reset the form after successful submit
	        error: errorCallback, 
	        contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
	    };
	return options;
}

function update(code, id) {
	var initParameters = 'initTemplate=';
	initParameters += id;
	initParameters += '&id=';
	initParameters += code;
	HomeClass.init(initParameters);
}

function deleteContent(service, id, component, drawAfterDelete) {
	if (id && service) {
		var parameters = "id=" + id;
		getPageAjax(service + '.action', function(data) {
			if (drawAfterDelete == true) {
				component.draw();
				MessageController.success(data.message);
			} else {
				HomeClass.init(HomeClass.oldState + '&success=' + data.message);
			}
		}, 'json', parameters);
	}
}

function deleteContentFromDialog(deleteDialog) {
	var id = deleteDialog.code;
	var parameters = "id=" + id;
	
	deleteFromDialog(deleteDialog, parameters);
}

function deleteMessagesFromDialog(deleteDialog) {
	var messages = deleteDialog.messages;
	var recommendations = deleteDialog.recommendations;
	var parameters = '';
	
	for (var i = 0; i < messages.length; i++) {
		parameters += 'messageCodes=' + messages[i] + '&';
	}
	
	for (var i = 0; i < recommendations.length; i++) {
		parameters += 'recommendationCodes=' + recommendations[i] + '&';
	}
	
	deleteFromDialog(deleteDialog, parameters);
}

function deleteFromDialog(deleteDialog, parameters) {
	var service = deleteDialog.service;
	var component = deleteDialog.component;
	var drawAfterDelete = deleteDialog.drawAfterDelete;
	var canShowMessage = deleteDialog.showMessage == null || deleteDialog.showMessage == true;
	if(component.isTopicMessage){
		parameters += "&parentId=" + component.parentId;
	}

	if (service) {
		getPageAjax(service + '.action', function(data) {
			if (!deleteDialog.isBox) {
				if (drawAfterDelete == null || drawAfterDelete == true) {
					var oldFunction = component.doLoaded;
					
					if (canShowMessage) {
						component.doLoaded = function() {
							MessageController.success(data.message, component.id, false);
							if (oldFunction) {
								oldFunction.apply(this);
							}
							
							component.doLoaded = oldFunction;
						}
					}
					
					component.drawAfterDelete();
					if(component.isTopicMessage){
						if(data.messagesSize > 0){
							$("#linkRemoveTopic").hide();
						}else{
							$("#linkRemoveTopic").show();
						}
					}
				} else {
					var successMessage = '';
					if (data.message && canShowMessage) {
						successMessage = '&success=' + data.message.URLEncode();
					}
					HomeClass.init('initTemplate=' + component.templateAfterDelete + successMessage);
				}
			} else {
				component.message = data.message;
				component.drawAfterDelete();
			}			
		}, 'json', parameters, function(data) {
			if (!deleteDialog.isBox) {
				if (data.responseText) {
					MessageController.error(data.responseText);
				} else {
					MessageController.error(data);
				}
			} else {
				if (data.responseText) {
					component.boxErrorMessage = data.responseText;
				} else {
					component.boxErrorMessage = data;
				}
				
				component.drawAfterDelete();
			}
		});
	}
}

function hideMessageById(id) {
	$("#" + id).fadeOut();
}

function _defaultClearRequest() {
	Ajax.abortAll();
	closeAllDialog();
	
	AddLinkObjectComponent.clear();
	
	if (HomeClass.loadedTemplate) {
		HomeClass.loadedTemplate.destroy();
	}
}

function closeTagMessage(component) {
	$('#' + component.id + 'tagMessage').slideUp();
	component.tagComponent.closedTagBox = true;
}

function initLettersCarousel(carouselId, leftId, rightId, maxVisible) {
	var _carouselId = '#' + carouselId;
	var _buttonLeft = '#' + leftId;
	var _buttonRight = '#' + rightId;
	
	$(_carouselId).carousel({
      visible: maxVisible,
      circular: false,
      beforeStart: function(before, after) {
		if (after.index($(_carouselId).find('li:first')) >= 0) {
			$(_buttonLeft).addClass('disabled');
		}
		if (after.index($(_carouselId).find('li:last')) >= 0) {
			$(_buttonRight).addClass('disabled');
		}
	  }
    });
    $(_buttonLeft).click(function() { $(_carouselId).carousel('prev') });
    $(_buttonRight).click(function() { $(_carouselId).carousel('next') });
}


var KeyCode = {
	BACKSPACE: 8,
	CAPS_LOCK: 20,
	COMMA: 188,
	CONTROL: 17,
	DELETE: 46,
	DOWN: 40,
	END: 35,
	ENTER: 13,
	ESCAPE: 27,
	HOME: 36,
	INSERT: 45,
	LEFT: 37,
	NUMPAD_ADD: 107,
	NUMPAD_DECIMAL: 110,
	NUMPAD_DIVIDE: 111,
	NUMPAD_ENTER: 108,
	NUMPAD_MULTIPLY: 106,
	NUMPAD_SUBTRACT: 109,
	PAGE_DOWN: 34,
	PAGE_UP: 33,
	PERIOD: 190,
	RIGHT: 39,
	SHIFT: 16,
	SPACE: 32,
	TAB: 9,
	UP: 38
};

function Codedata(code, description) {
	this.code = code;
	this.description = description;

	this.getCode = function () {
		return this.code;
	};

	this.getDescription = function () {
		return this.description;
	}

	this.equals = function (codedata) {
		return code == codedata.code && description == codedata.description;
	}
	
	this.toString = function () {
		return '[' + code + ', ' + description + ']';
	}
}

function addTagCssClass(id, tagTotalCount, smallTag, middleTag, bigTag){
	var cssClass = '';
	if(tagTotalCount >= smallTag && tagTotalCount < middleTag ){
		cssClass = 'tag_normal';
	}else if(tagTotalCount >= middleTag && tagTotalCount < bigTag){
		cssClass = 'tag_xbold';
	}else{
		cssClass = 'tag_xxbold';
	}

	$('#' + id).addClass(cssClass);
}

String.prototype.startsWith = function (string) {
	return (this.match("^" + string) == string);
}

String.prototype.trim = function () {
	return (this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, ""))
}

function replaceAll(string, token, newtoken) {
	var newString = string;
	
	while (newString.indexOf(token) != -1) {
		newString = newString.replace(token, newtoken);
	}
	
	return newString;
}

function showMoreListMode(componentId){
	var show = slideElement(document.getElementById(componentId + "_description"));
	replaceBackgroundImage('divShowMore'+componentId, 'st_grl_fechar.png', 'st_grl_abrir.png');
}

function replaceBackgroundImage(elementId, closeImgName, openImgName){
	var divShowMore = document.getElementById(elementId);

	if(divShowMore.style.backgroundImage.indexOf(closeImgName) > -1){
		divShowMore.style.backgroundImage = 'url(images/'+openImgName+')';
	}else{
		divShowMore.style.backgroundImage = 'url(images/'+closeImgName+')';
	}
}

function slideComponentMode(componentId){
	var show = slideElement(document.getElementById(componentId + "_list"));
	replaceBackgroundImage('divSlideComponent'+componentId, 'ic_stTpCx_bx.png', 'ic_stTpCx.png');
}

function slideComponentTagMode(componentId){
	var show = slideElement(document.getElementById(componentId + "_list"));
	replaceBackgroundImage('divSlideComponent'+componentId, 'ic_stTpCx2_bx.png', 'ic_stTpCx2.png');
}

function showAddContactDialog(userName, userCode, component, userInSessionCode){
	if(userInSessionCode != userCode){
		AddContactDialog.component = component;
		AddContactDialog.loadUserData(userName, userCode);
		AddContactDialog.openAddContactDialog();
	}else{
		AddContactDialog.showInvalidContactMessage();
	}
}

function singleJoinCommunity(communityCode, divId) {
	var divObject = $("#" + divId);
	var divAction = $("#" + divId + '> .dft_acsSmp');
	var oldHtml = divAction.html();
	var spanNumberOfMembers = $("#spanNumberOfMembers_" + communityCode);
	divAction.html('<img src="images/loading_azul.gif" />');
	
	var parameters = "&id=" + communityCode;
	
	getPageAjax('joinCommunityService.action', function(data) {
		if (data.isModerated && !data.isMember) {
			divAction.html(oldHtml);
			MessageController.success(data.message);
		} else if (data.isMember) {
			divObject.addClass('dft_sCmnd');
			divAction.removeClass('dft_acsSmp');
			divAction.addClass('dft_lstIt_sCmnd');
			divAction.html('<p>' + data.memberLabel + '</p>');
			spanNumberOfMembers.html(data.numberOfMembers);
		}
	}, 'json', parameters);
}

function joinCommunity(communityCode, service, component, divId){
	submitCommunityData(communityCode, service, component, divId);
}

function quitCommunity(communityCode, service, component, divId){
	submitCommunityData(communityCode, service, component, divId);
}

function submitCommunityData(communityCode, service, component, divId){
	$("#" + divId).html('<img src="images/loading_azul.gif">');
	var parameters = "&id=" + communityCode;
	
	getPageAjax(service, function(data) {
		if (data.canRead == null || data.canRead == true || data.isMember) {
			component.draw();
			MessageController.success(data.message);
		} else {
			var message = $.URLEncode(data.message);
			var encodedUrl = ('home&success=' + message);
			callTemplate(encodedUrl);
		}
	}, 'json', parameters);
}

var ViewMode = {
	init : function(viewMode, component) {
		if (viewMode) {
			if (viewMode == 0) {
				ViewMode.list(component);
			} else {
				ViewMode.icon(component);
			}
		} else {
			ViewMode.list(component);
		}
	},
	
	list : function(component) {
		ViewMode.showViewMode(component.id + 'ListHref', component.id + 'IconHref', component.id + 'ListView', component.id + 'IconView', component, 0);
	},
	
	icon: function(component) {
		ViewMode.showViewMode(component.id + 'IconHref', component.id + 'ListHref', component.id + 'IconView', component.id + 'ListView', component, 1);
	},

	showViewMode: function(sourceHref, targetHref, toShow, toHide, component, value) {
		$("#" + sourceHref).removeClass('slct');
		$("#" + targetHref).addClass('slct');
		$("#" + toHide).hide();
		$("#" + toShow).show();
		component.addAttribute('viewMode', value);
	}
}

function closeBar(divId){
	var div = document.getElementById(divId);
	slideElement(div);
	$("#a_" + divId).removeClass('selected');
}

function formatErrorMessage(message) {
	var array = message.split('<token>');
	var formatteMessage = '<ul>';
	
	for (var i = 0; i < array.length; ++i) {
		formatteMessage += '<li>';
		formatteMessage += array[i];
		formatteMessage += '</li>';
	}
	formatteMessage += '</ul>';
	return formatteMessage;
}

function showSuccessByTypeMessage(message, component) {
	if (component.isBox) {
		component.message = message;
	} else {
		MessageController.success(message);
	}
}

function showErrorByTypeMessage(message, component) {
	if (component.isBox) {
		component.message = message;
	} else {
		MessageController.error(message);
	}
}

function removeDocumentAssociationFromCommunity(documentId, communityId, component) {
	RemoveCommunityAssociationDialog.open();
	RemoveCommunityAssociationDialog.confirm = function() {
		var parameters = 'id=' + communityId + '&documentId=' + documentId;
		
		var ajaxArgs = getAjaxArgs();
		ajaxArgs.type = 'GET';
		ajaxArgs.dataType = 'json';
		ajaxArgs.data = parameters;
		ajaxArgs.url = 'removeDocumentAssociationService.action';
		
		ajaxArgs.success = function(data) {
			showSuccessByTypeMessage(data.message, component);
			component.draw();
		}
		
		ajaxArgs.error = function(request) {
			showErrorByTypeMessage(request.responseText, component);
			component.draw();
		}
		
		Ajax.load(ajaxArgs, 'removeDocumentAssociationService' + '_' + documentId + '_' + communityId);
	}
}

function removeNarrativeAssociationFromCommunity(documentId, communityId, component) {
	RemoveCommunityAssociationDialog.open();
	RemoveCommunityAssociationDialog.confirm = function() {
		var parameters = 'id=' + communityId + '&narrativeId=' + documentId;
		
		var ajaxArgs = getAjaxArgs();
		ajaxArgs.type = 'GET';
		ajaxArgs.dataType = 'json';
		ajaxArgs.data = parameters;
		ajaxArgs.url = 'removeNarrativeAssociationService.action';
		
		ajaxArgs.success = function(data) {
			showSuccessByTypeMessage(data.message, component);
			component.draw();
		}
		
		ajaxArgs.error = function(request) {
			showErrorByTypeMessage(request.responseText, component);
			component.draw();
		}
		
		Ajax.load(ajaxArgs, 'removeNarrativeAssociationService' + '_' + documentId + '_' + communityId);
	}
}

function closeComponentMessage(id) {
	$('#' + id + 'ComponentMessage').slideUp();
	$('#' + id + 'ComponentMessageContent').html('');
}

function subscribe(value, id, componentId, receiveText, notReceiveText, service, imgSrc){
	var parameters = "subscribe=" + value + "&id=" + id;
	$("#" + "ulSubscribe" + componentId).html('<img src="'+imgSrc+'">');
	getPageAjax(service + ".action", function(data) {
		var liHtml = '';
		if(data.subscribe){
			liHtml = '<li class="dft_aEsp_rcCmnt_slct"><a href="javascript:void(0);" onclick="subscribe' + componentId + '(false);">' + notReceiveText + '</a></li>';
		}else{
			liHtml = '<li class="dft_aEsp_rcCmnt"><a href="javascript:void(0);" onclick="subscribe' + componentId + '(true);">' + receiveText + '</a></li>';
		}
		$("#" + "ulSubscribe" + componentId).html(liHtml);
		
	}, 'json', parameters);
}

function favorite(value, id, componentId, favoriteText, notFavoriteText, service, imgSrc){
	var parameters = "favorite=" + value + "&id=" + id;
	$("#" + "ulImportant" + componentId).html('<img src="'+imgSrc+'">');
	getPageAjax(service + ".action", function(data) {
		var liHtml = '';
		if(data.favorite){
			liHtml = '<li class="dft_aEsp_cntImp_slct"><a href="javascript:void(0);" onclick="favorite' + componentId + '(false);">' + notFavoriteText + '</a></li>';
		}else{
			liHtml = '<li class="dft_aEsp_cntImp"><a href="javascript:void(0);" onclick="favorite' + componentId + '(true);">' + favoriteText + '</a></li>';
		}
		$("#" + "ulImportant" + componentId).html(liHtml);
		
	}, 'json', parameters);
}

function loadStates(country) {
	var countryCode = country.options[country.selectedIndex];
	getPageAjax('getStatesService.action', receiveStates, 'json', 'countryCode=' + countryCode.value);
}

function resetPolicy(type){
	var checkboxes = $(":checkbox");
	for(var i=0; i < checkboxes.length; i++){
		checkboxes.get(i).disabled = false;
		checkboxes.get(i).checked = false;
	}
	component[type + 'Association'].controlClass.reset();
}

function hideMessage(messagePanelId) {
	$("#" + messagePanelId).fadeOut();
}

function pageUp () {
	if (window.scroll) {
		window.scroll(0, 0);
	}
}

function goTo(id, animated) {
	document.location.hash = id;
	
	if (animated == null || animated == true) {
		$('#' + id).fadeOut(400).fadeIn(400);
	}
}
 
function showDefaultPopupErrorMessage(divId, errorData){
	var divContent = '<div class="dft_mnS_cl">';
	divContent += '<a href="javascript:closeDiv(&quot;'+divId;
	divContent += '&quot;);">Fechar</a></div>';
	divContent += '<p>';
	divContent += replaceAll(errorData.responseText,'<token>','</p><p>');
	divContent += '</p>';

	$("#" + divId).html(divContent);
	$("#" + divId).show();
}

function closeDiv(divId){
	$("#" + divId).hide();
}

function selectAll(itemName, spanId, aId, unselectText, selectText) {
	var items = document.getElementsByName(itemName);
	if (items) {
		for (var i=0; i<items.length;i++) {
			items[i].checked=true;
		}
		$('#' + spanId).html(unselectText);
		$('#' + aId).attr('href', 'javascript:deselectAll("'+itemName+'", "'+spanId+'", "'+aId+'", "'+unselectText+'", "'+selectText+'")');
	}
}
 
function deselectAll(itemName, spanId, aId, unselectText, selectText) {
	var items = document.getElementsByName(itemName);
	if (items) {
		for (var i=0; i<items.length;i++) {
			items[i].checked=false;
		}
		
		$('#' + spanId).html(selectText);
		$('#' + aId).attr('href', 'javascript:selectAll("'+itemName+'", "'+spanId+'", "'+aId+'", "'+unselectText+'", "'+selectText+'")');
	}
}

function rate(id, service, componentId, value){
	var parameters = "rate=" + value + "&id=" + id;
	getPageAjax(SERVICE_CONTEXT + service + ".action", function (data) {
		showRateCallback(data, componentId);
	}, 'json', parameters);
}

function showRateCallback(data, componentId) {
	updateNumberOfViews(data);
	showRate(data.entity.averageRate, data.entity.userRate, componentId);
}

function showRate(averageRate, userRate, componentId) {
	var imageRate = '';
	for (var i = 0; i < 5; i++){
		if (userRate == (i * 2)){
			document.getElementById("liRate" + componentId + (i * 2)).className = selectedClasses[i];				
		} else {
			document.getElementById("liRate" + componentId + (i * 2)).className = unselectedClasses[i];
		}
	}
	if (averageRate == -1) {
		imageRate = '<img src="images/im_brVot_inicio.png" />';
	} else {
		imageRate = averageImages[Math.round(averageRate)];
	}
	$("#" + "imageRate" + componentId).html(imageRate);
}

function setAsRead(id, service, componentId){
	var parameters = "&id=" + id;
	
	getPageAjax(SERVICE_CONTEXT + service + ".action", function (data) {
		updateNumberOfViews(data, componentId);
	}, 'json', parameters);
}

function updateNumberOfViews(data, componentId) {
	$("#span_number_of_views_" + componentId).html(data.entity.numberOfViews);
}

function notifyViewWarning(id, project){
	var parameters = "rate=-1" + "&id=" + id;
	
	var action = "setAsReadWarningService.action";
	if (project) {
		action = "setAsReadProjectWarningService.action";
	}

	getPageAjax(action, function(data) {
		$("#span_number_of_views").html(data.entity.numberOfViews);
	}, 'json', parameters);
}

function removeCommunityMember(memberId, communityId, component) {
	RemoveCommunityMemberDialog.open();
	RemoveCommunityMemberDialog.confirm = function() {
		var parameters = 'id=' + communityId + '&memberId=' + memberId;
		
		var ajaxArgs = getAjaxArgs();
		ajaxArgs.type = 'GET';
		ajaxArgs.dataType = 'json';
		ajaxArgs.data = parameters;
		ajaxArgs.url = 'removeCommunityMemberService.action';
		
		ajaxArgs.success = function(data) {
			component.message = data.message;
			component.draw();
		}
		
		ajaxArgs.error = function(request) {
			component.message = request.responseText;
			component.draw();
		}
		
		Ajax.load(ajaxArgs, 'removeCommunityMemberService' + '_' + memberId + '_' + communityId);
	}
}

function imposeMaxLength(ob, maxLen) {
  return (ob.value.length <= maxLen);
}

function cancelForm() {
	if (HomeClass.oldState) {
		HomeClass.init(HomeClass.oldState);
	} else {
		callTemplate('initTemplate=viewHome');
	}
}

function triggerSave(editorName, inputName, resetContent) {
	var oEditor = FCKeditorAPI.GetInstance(editorName);
	if (inputName != null) {
		$("#" + inputName).attr('value', oEditor.GetHTML(true));
	} else {
		oEditor.UpdateLinkedField();
	}
	if (resetContent) {
		oEditor.SetHTML('');
	}
	return true;
}

function clearRichEditorContent(editorName) {
	var oEditor = FCKeditorAPI.GetInstance(editorName);
	if (oEditor) {
		oEditor.SetHTML('');
	}
}

function initTagBoxCarousel(carouselId, leftId, rightId, maxVisible) {
	var _carouselId = '#' + carouselId;
	var _buttonLeft = '#' + leftId;
	var _buttonRight = '#' + rightId;
	
	$(_carouselId).carousel({
      visible: maxVisible,
      circular: false,
      vertical: true,
      beforeStart: function(before, after) {
		if (after.index($(_carouselId).find('li:first')) >= 0) {
			$(_buttonLeft).addClass('disabled');
		}
		if (after.index($(_carouselId).find('li:last')) >= 0) {
			$(_buttonRight).addClass('disabled');
		}
	  }
    });
    $(_buttonLeft).click(function() { $(_carouselId).carousel('prev') });
    $(_buttonRight).click(function() { $(_carouselId).carousel('next') });
}

function initRichEditorOnTextArea(textAreaName, template, width, height) {
	try {
		var fckEditor = initRichEditorObjectOnly(textAreaName, template, width, height);
		fckEditor.ReplaceTextarea();
	} catch (error) {
		DOC_HREF = SERVICE_CONTEXT + 'home.action?' + HomeClass.getState();
	}
}

function initRichEditor(editorName, template, width, height) {
	_initRichEditor(initRichEditorObjectOnly, editorName, template, width, height);
}

function initOrUpdateRichEditor(editorName, template, width, height) {
	_initRichEditor(initOrOpenRichEditorObjectOnly, editorName, template, width, height);
}

function _initRichEditor(executeFunction, editorName, template, width, height) {
	try {
		var fckEditor = executeFunction(editorName, template, width, height);
		$('#' + editorName).html(fckEditor.CreateHtml());
	} catch (error) {
		DOC_HREF = SERVICE_CONTEXT + 'home.action?' + HomeClass.getState();
	}
}

function initOrOpenRichEditorObjectOnly(editorName, template, width, height) {
	var fckEditor = new FCKeditor(editorName, width, height, template, null);
	defaultConfigFckEditor(fckEditor);
	
	return fckEditor;
}

function initRichEditorObjectOnly(editorName, template, width, height) {
	var fckEditor = new FCKeditor(editorName, width, height, template, document.getElementById(editorName).innerHTML);
	defaultConfigFckEditor(fckEditor);
	
	return fckEditor;
}

function defaultConfigFckEditor(fckEditor) {
	if (fckEditor) {
		if (systemLanguage != null) {
			fckEditor.Config["AutoDetectLanguage"] = false ;
		}
		
		fckEditor.Config["DefaultLanguage"] = systemLanguage ;
	}
}

function breakWord(word, max) {
	var newWord = word;
	
	if (newWord && max && newWord.length > max + 1) {
		newWord = newWord.substring(0, max + 1);
		
		var index = newWord.lastIndexOf(' ');
		var index2 = newWord.lastIndexOf('&nbsp;');
		
		index = Math.max(index, index2);
		
		if (index == 0 || index == -1) {
			index = max;
		}
		
		newWord = newWord.substring(0, index);
		newWord += '...';
	}
	
	return newWord;
}

String.prototype.breakText = function (max) {
	var newText = this;
	
	if (newText) {
		newText = newText.replace(/<\/?[^>]*\/?>/g, ' ');
		newText = breakWord(newText, max);
	}
	
	return newText;
}

function validateTextMaxLength(text, max) {
	var regex = new RegExp('[^ ]{' + max + '}', 'g');
	return !regex.test(text);
}

var MaxLengthDefinition = {
	MAX_TITLE_LENGTH: 72,
	MAX_TEXT_LENGTH: 100,
	MAX_LINK_LENGTH: 60,
	MAX_LINK_LENGTH_SHORT: 30,
	MAX_TAGBOX_NAME_LENGTH: 20,
	MAX_FUNCTION_LENGTH: 25
}

String.prototype.URLEncode = function () {
	return $.URLEncode(this);
}

String.prototype.URLDecode = function () {
	return $.URLDecode(this);
}

String.prototype.escapeDoubleQuotes = function () {
	return this.replace(/"/g, '&quot;');
}

String.prototype.escapeDoubleQuotesToEdit = function () {
	return this.replace(/"/g, '\\"');
}

function cancelFileOrBookmarkCreation(divId, formId, associationType){
	closeBar(divId);
	resetFormTextFields(formId, associationType);
}

function resetFormTextFields(formId, associationType){
	var form = document.getElementById(formId);
	
	for(var i=0; i < form.elements.length; i++){
		if(form.elements[i].type == 'text' || form.elements[i].type == 'file'){
			form.elements[i].value='';
		}
		
		if(form.elements[i].type == 'textarea'){
			var oEditor = FCKeditorAPI.GetInstance(form.elements[i].id);
			oEditor.SetHTML('');
		}
	}

	resetPolicy(associationType);
}

function setElementFocus(formId, elementName) {
	var form = document.getElementById(formId);

	if (form) {
		var element = form[elementName];
		
		if (element) {
			try {
				$(element).show();
				element.focus();
			} catch (e) {
				// IE error
			}
		}
	}
}

function closeBoxErrorMessage(id) {
	$('#' + id + 'BoxErrorMessage').slideUp();
	$('#' + id + 'BoxErrorMessageContent').html('');
}

function getFilteredTerms(fieldId){
	var terms = $('#' + fieldId).attr('value').replace(/[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~\r\t\n]/g, '');
	return terms;
}

var Event = {
	ADD: 1,
	REMOVE: 2,
	ADD_ALL: 3,
	REMOVE_ALL: 4,
	UPDATED : 5,
	RESETED: 6
}

function allowOnlyNumbers(e){
    var keyPressed=(window.event)?event.keyCode:e.which;
    
    if((keyPressed > 47 && keyPressed < 58) || keyPressed == 0 || keyPressed == 8){
    	return true;
    }else{
   		return false;
    }
}

function removeElement(element) {
	if (element) {
		var parent = element.parentNode;
		parent.removeChild(element);
	}
}

function removeOnKeyPressFromClass() {
	var inputs = $('.removeEnterOfKeyPress');

	for (var i = 0; i < inputs.length; i++) {
		var input = inputs.get(i);
		$(input).removeClass('removeEnterOfKeyPress');
		var oldKeypress = input.onkeypress;
		input.onkeypress = function (event) {
			if (oldKeypress) {
				oldKeypress();
			}
			return removeEnterOfKeyPress(event);
		}
	}		
}

function removeEnterOfKeyPress(event) {
	var _event = (window.event) ? window.event : event;
	
	if (_event.keyCode == KeyCode.ENTER) {
		return false;
	}
}

function getJSONMultipartFormOptions(successCallback) {
	var options = getJSONFormOptions(successCallback, function(){});
	options.iframe = true;
	return options;
}

var FilterComponentAPI = {
	FILTER_COMPONENTS: new Array(),

	addInstance: function(id, instance) {
		FilterComponentAPI.FILTER_COMPONENTS[id] = instance;
	},
	
	getInstance: function(id) {
		return FilterComponentAPI.FILTER_COMPONENTS[id];
	}
}
function FilterComponent(id) {
	this.id;
	this._contents;
	this._visibleContantes;
	this._observers;

	this.init = function() {
		this._contents = new Array();
		this._visibleContantes = new Array();
		this._observers = new Array();
		FilterComponentAPI.addInstance(this.id, this);
		
		this.reset();
	};

	this.show = function() {
		var html = '';
		
		for (var i = 0; i < this._contents.length; i++) {
			var data = this._contents[i];

			if (this._canShow(data)) {
				var code = data.code;
				var name = data.description;
				html += '<li id="' + code + '_' + this.id + '_filter_li_element">';
				html += '<label><input type="checkbox" id="' + code + '_' + this.id + '_filter_checkbox_element"';
				html += ' onclick="FilterComponentAPI.getInstance(\'' + this.id + '\').check(this)"';
				html += ' name="' + this._getNameElement(this._contents[i]) + '"';
				html += ' value="' + this._getValueElement(this._contents[i]) + '">';
				html += name;
				html += '</input></label>';
				html += '</li>';
			}
		}

		$('#' + this.id).html(html);
		this._changeToSelectOrUnselectAll();
	};

	this.filter = function(input) {
		var terms = input ? input.value : '';
		this._visibleContantes = new Array();

		for (var i = 0; i < this._contents.length; i++) {
			var code = this._contents[i].code;
			var name = this._contents[i].description;
			
			var isFound = (!terms || terms.trim() == '' || name.trim().toUpperCase().indexOf(terms.trim().toUpperCase()) == 0);
			var liId = code + '_' + this.id + '_filter_li_element';
			
			if (isFound) {
				$('#' + liId).show();
				this._visibleContantes[this._visibleContantes.length] = code;
			} else {
				$('#' + liId).hide();
			}
		}
		
		this._changeToSelectOrUnselectAll();
		this._notify();
	};

	this.check = function(element) {
		this._changeToSelectOrUnselectAll();
		this._notify();
	};
	
	this.selectAll = function(element) {
		for (var i = 0; i < this._visibleContantes.length; i++) {
			this.select(this._visibleContantes[i]);
		}
		
		this._changeToSelectOrUnselectAll();
		this._notify();
	};
	
	this.unselectAll = function(element) {
		for (var i = 0; i < this._visibleContantes.length; i++) {
			this.unselect(this._visibleContantes[i]);
		}
		
		this._changeToSelectOrUnselectAll();
		this._notify();
	};
	
	this.select = function(code) {
		var id = code + '_' + this.id + '_filter_checkbox_element';
		var element = document.getElementById(id);
		
		if (element) {
			element.checked = true;
		}
		
		return element;
	};
	
	this.unselect = function(code) {
		var id = code + '_' + this.id + '_filter_checkbox_element';
		var element = document.getElementById(id);
		
		if (element) {
			element.checked = false;
		}
		
		return element;
	};

	this.addContent = function(code, name) {
		this._contents[this._contents.length] = new Codedata(code, name);
		this._visibleContantes[this._visibleContantes.length] = code;
	};
	
	this.getSelectedContents = function() {
		var selecteds = new Array();
		
		for (var i = 0; i < this._contents.length; i++) {
			var content = this._contents[i];
			var code = content.code;
			
			var id = code + '_' + this.id + '_filter_checkbox_element';
			var element = document.getElementById(id);
			
			if (element && element.checked) {
				selecteds[selecteds.length] = content;
			}
		}
		
		return selecteds;
	};
	
	this.reset = function() {
		this._visibleContantes = new Array();
		
		for (var i = 0; i < this._contents.length; i++) {
			var code = this._contents[i].code;
			
			var id = code + '_' + this.id + '_filter_checkbox_element';
			var element = document.getElementById(id);
			
			if (element) {
				element.checked = false;
			}
			
			this._visibleContantes[this._visibleContantes.length] = code;
		}
		
		this._changeToSelectOrUnselectAll()
	};
	
	this.hasSelected = function() {
		var hasSelected = false;
		for (var i = 0; i < this._contents.length; i++) {
			var code = this._contents[i].code;
			
			var id = code + '_' + this.id + '_filter_checkbox_element';
			var element = document.getElementById(id);
			
			if (element && element.checked) {
				hasSelected = true;
				break;
			}
		}
		
		return hasSelected;
	};
	
	this.addObserver = function(observer) {
		this._observers[this._observers.length] = observer;
	};
	
	this._notify = function() {
		for (var i = 0; i < this._observers.length; i++) {
			if (this._observers[i].update) {
				this._observers[i].update(null, null, Event.UPDATE, this);
			}
		}
	};
	
	this._changeToSelectOrUnselectAll = function(element) {
		var elements = this._getSelectAllElements();
		
		for (var i = 0; i < elements.length; i++) {
			var element = elements[i];
			
			if (element) {
				if (this._isAllSelected()) {
					this._changeToUnselectAll(element);
				} else {
					this._changeToSelectAll(element);
				}
			}
		}
	};

	this._changeToSelectAll = function(element) {
		if (element) {
			element.innerHTML = this._getSelectAllName();
			
			var obj = this;
			element.onclick = function() {obj.selectAll();};
		}
	};
	
	this._changeToUnselectAll = function(element) {
		if (element) {
			element.innerHTML = this._getUnselectAllName();
			
			var obj = this;
			element.onclick = function() {obj.unselectAll();};
		}
	};
	
	this._isAllSelected = function() {
		var allSelected = this._visibleContantes.length > 0 ? true : false;
		
		for (var i = 0; i < this._visibleContantes.length; i++) {
			var id = this._visibleContantes[i] + '_' + this.id + '_filter_checkbox_element';
			var element = document.getElementById(id);
			
			if (element && !element.checked) {
				allSelected = false;
				break;
			}
		}
		
		return allSelected;
	};

	this._canShow = function(data) {return true};
	this._getSelectAllName = function() {alert('implements _getSelectAllName method');};
	this._getUnselectAllName = function() {alert('implements _getUnselectAllName method');};
	this._getSelectAllElements = function() {alert('implements _getSelectAllElements method');};
	this._getNameElement = function(data) {alert('implements _getNameElement method');};
	this._getValueElement = function(data) {return data.code;};
}

String.prototype.escapeSlash = function () {
	return this.replace(/\\/g, '\\\\');
}

function updateLinkToThisPage() {
	var linkToThisPageContent = document.getElementById('linkToThisPageContent');
	if (linkToThisPageContent) {
		linkToThisPageContent.value = SERVICE_HOST + SERVICE_CONTEXT + 'home.action?' + HomeClass.getState();
	}
}

/**
 *	tools to date
 */
var DateUtil = {
	/**
	 * @precondition	(pattern && date) != null
	 * 					pattern - valid attributes: dd = day, mm = month, yy = year
	 * 
	 * @return string date in pattern format
	 */
	getFormatedDate: function(pattern, date) {
		var formatedDate = '';
		if (date) {
			var day = date.getDate();
			var month = (date.getMonth() + 1);
			var year = date.getYear().toString();
			
			if (date.getDate() < 10) {
				day = '0' + day;
			}
			
			if ((date.getMonth() + 1) < 10) {
				month = '0' + month;
			}
			
			var yearLength = year.length;
			formatedDate = pattern.replace(/(dd)/g, day).replace(/(mm)/g, month).replace(/(yy)/g, year.substring(yearLength - 2, yearLength));
		}
		
		return formatedDate;
	},
	
	/**
	 *	@precondition amount != null && date != null
	 *	@postcondition not change the date
	 */
	addDate: function(amount, date) {
		return DateUtil._add('Date', amount, date);
	},

	/**
	 *	@precondition amount != null && date != null
	 *	@postcondition not change the date
	 */
	addWeek: function(amount, date) {
		return DateUtil.addDate(amount * 7, date);
	},
	
	/**
	 *	@precondition amount != null && date != null
	 *	@postcondition not change the date
	 */
	addMonth: function(amount, date) {
		var _date = DateUtil._add('Month', amount, date);
		
		if (_date && date.getDate() > _date.getDate() && _date.getDate() == 1) {
			_date = DateUtil.addDate(-1, _date);
		}
		
		return _date;
	},

	/**
	 *	@precondition amount != null && date != null
	 *	@postcondition not change the date
	 */
	addYear: function(amount, date) {
		return DateUtil._add('Year', amount, date);
	},

	/**
	 *	@precondition typeToAdd == (Date | Month | Year) && (amount && date) != null
	 */
	_add: function(typeToAdd, amount, date) {
		var isValidType = typeToAdd != null && (typeToAdd == 'Date' || typeToAdd == 'Month' || typeToAdd == 'Year');
		var _date = null;

		if (isValidType && amount && date) {
			_date = new Date(date.getTime());
			var value = _date['get' + typeToAdd]();
			value += amount;
			_date['set' + typeToAdd](value);
		}

		return _date;
	}
};

function verifyCheckboxes(elementName){
	var checked = false;
	var elements = document.getElementsByName(elementName);
	for(var i=0; i < elements.length; i++){
		if(elements[i].checked){
			checked = true;
			break;
		}
	}
	
	return checked;
}

function decode(text) {
	return $.URLDecode(text).replace(/\+/g, '&nbsp;');
}

function cleanString(s) {
	return s.replace(/^\s+/, '').replace(/\s+$/, '');
}
