
// Add textfield label
function addTextfieldLabels(addEvents) {
	$$('input').each(function(el, index) {
		if((el.get('type') == 'button' || el.get('type') == 'submit') && (!el.hasClass('button_red') && !el.hasClass('button_green') && !el.hasClass('button_red'))) {
			el.addClass('button');
		}
		if(el.get('type') == 'checkbox' || el.get('type') == 'radio') {
			el.addClass('checkbox');
		}
		if(el.getProperty('type') == 'text' && el.getAttribute("alt")) {
			var alt = el.getAttribute("alt");
			alt.split('|').each(function(single_class) {
				if (alt.match(/^focusLabel\[.+\]$/)) {
					var focusTitle = alt.match(/^focusLabel\[(.+)\]$/)[1];
					el.removeClass('hasTitle');
					if(el.value == '' || el.value == focusTitle) {
						el.value = focusTitle;
						el.addClass('hasTitle');
					}
					if(addEvents != false) {
						el.addEvent('focus', function() {
							if(el.value == focusTitle) {
								el.value = '';
								el.removeClass('hasTitle');
							}
						}).addEvent('keyup', function() {
							if(el.get('class') == 'hasTitle') {
								el.removeClass('hasTitle');
							}
						}).addEvent('blur', function() {
							if(el.value == '') {
								el.value = focusTitle;
								el.addClass('hasTitle');
							}
						});
					}
				}
			});
		}
	});
}

// Add paste events
$extend(Element.NativeEvents, {
	'paste': 2, 'input': 2
});
Element.Events.paste = {
	base : (Browser.Engine.presto || (Browser.Engine.gecko && Browser.Engine.version < 19)) ? 'input': 'paste',
	condition: function(e) {
		this.fireEvent('paste', e, 1);
		return false;
	}
};

// Add growing texareas
function addGrowingTextareas() {
	$$('.growing_textarea').each(function(element) {
		var height = element.getStyle('font-size').toInt() + element.getStyle('padding-top').toInt();
		element.setStyle('height', height);
		element.store('original_height', height);
		element.setStyle('overflow',  'hidden');
		element.resize = function(e) {
			if (e.key == 'enter' && !this.hasClass('enter_nl') && !this.hasClass('enter_submit')) {
				new Event(e).stop();
			} else if(e.key == 'enter' && this.hasClass('enter_submit')) {
				this.getParent('form').fireEvent('submit');
				new Event(e).stop();
			}
			var clone = this.clone(true);
			clone.setStyle('visibility', 'hidden');
			clone.setStyle('position', 'absolute');
			clone.inject($(document.body), 'after');
			clone.set('value', clone.get('value') + 'W');
			clone.setStyle('height', this.retrieve('original_height'));
			if (clone.getScrollSize().y - clone.getStyle('height').toInt() >= clone.getStyle('font-size').toInt()) {
				clone.setStyle('height', clone.getScrollSize().y);
			}
			if (this.getStyle('height') != clone.getStyle('height')) {
				this.setStyle('height', clone.getStyle('height'));
			}
			clone.dispose();
			return true;
		};
	});
	$$('.growing_textarea').addEvent('paste', function (e) {
		return this.resize(e);
	})
	$$('.growing_textarea').addEvent('keydown', function (e) {
		this.set('value', this.get('value').replace('  ', ' '));
		return this.resize(e);
	});
	$$('.growing_textarea').addEvent('focus', function (e) {
		return this.resize(e);
	});
	$$('.growing_textarea').addEvent('blur', function (e) {
		return this.resize(e);
	});

}


// Add confirm lightface
function addConfirmFirst() {
	$$('a').each(function(el, index) {
		if(el.getAttribute("alt")) {
			var alt = el.getAttribute("alt");
			alt.split('|').each(function() {
				if (alt.match(/^confirmFirst\[.+\]$/)) {
					if(!el.retrieve('has_confirm_lightface')) {
						var options = alt.match(/^confirmFirst\[(.+)\]$/)[1];
						var options_array = options.split('>>');
						var confirm_message = options_array[0];
						var confirm_yes = options_array[1] ? options_array[1] : 'Ja';
						var confirm_no = options_array[2] ? options_array[2] : 'Nein';
						el.store('has_confirm_lightface', true);
						
						el.addEvent('click', function(e) {
							e.stop();
							if(confirm_first_lightface) {
								confirm_first_lightface.destroy();
								confirm_first_lightface = null;
							}
							var confirm_first_lightface = new LightFace({
									content: '<div style="padding:25px">' + confirm_message + '</div>',
									buttons: [
											{ title: confirm_no, event: function() { confirm_first_lightface.close(); }, id: 'confirmFirstNo', color: ''},
											{ title: confirm_yes, event: function() { 
												removeLayer();
												confirm_first_lightface.destroy();
												confirm_first_lightface = null;
												window.location.href = el.get('href');
											}, id: 'confirmFirstYes', color: 'green' }
											],
									onClose: function() {
										removeLayer();
									},
									onOpen: function() {
										if($('confirmFirstYes').value == 'Ja') {
											$('confirmFirstYes').setStyle('width', '40px');
										}
									}
							});
							addLayer(confirm_first_lightface.options.zIndex - 1);
							confirm_first_lightface.open();
						});	
					}
				}	
			});
		}
	});
}

// Add Link-Check
function addLinkCheck() {
	$$('.linkCheck').each(function(el, index) {
		el.addEvent('blur', function() {
			if(el.value.substr(0, 7) != 'http://' && el.value.substr(0, 8) != 'https://' && el.value.substr(0, 6) != 'ftp://' && el.value != '' && !el.hasClass('hasTitle')) {
				el.value = 'http://' + el.value;
			} else if(el.value == 'http://' || el.value == 'https://' || el.value == 'ftp://') {
				el.value = '';
				addTextfieldLabels();
			}
		});
	});	
}

// Add open links in new window
function addExternLinks() {
	$$('.externLink').each(function(el, index) {
		var extern = function() {
			window.open(el.href);
			return false;
		}
		if(!el.hasEvent('click', extern)) {
			el.addEvent('click', extern);
		}
	});
}

// Add layer to prevent linkclicks
function addLayer(zindex, color, opacity) {
	if(!zindex) zindex = 11000;
	var height = $(document.body).getScrollSize().y;
	var width = $(document.body).getScrollSize().x;
	if(!$('documentLayer')) {
		var documentLayer = new Element('div', {'id':'documentLayer'}).setStyles({'position': 'absolute', 'top': 0, 'left': 0, 'width':width, 'height':height, 'z-index': zindex, 'background': 'transparent'}).inject(document.body,'bottom');
		
		if(color) { documentLayer.setStyle('background', color); } else { documentLayer.setStyle('background', 'transparent'); }
		if(opacity) { documentLayer.setStyle('opacity', opacity); } else { documentLayer.setStyle('opacity', 1); }
	}
}
function removeLayer() {
	if($('documentLayer')) {
		$('documentLayer').destroy();
	}
}

// Add required stars
function addRequired() {
	$$('.required_text').each(function(el, index) {
		if(el.value != '' && !el.hasClass('hasTitle')) {
			el.removeClass('required_text');
		}
		el.addEvent('focus', function() {
			el.removeClass('required_text');
		}).addEvent('blur', function() {
			if(el.value == '' || el.hasClass('hasTitle')) {
				el.addClass('required_text');
			}
		});
	});
	
	$$('.required_select').each(function(el, index) {
		el.removeClass('required_select')
		
		el.setStyles({'float': 'left'});
		var requiredStar = new Element('div').setStyles({'float':'left', 'width':'12px', 'height': el.getStyle('height').toInt(), 'margin-top':'1px'}).inject(el, 'after');
		var clearFloat = new Element('div').setStyles({'clear':'both'}).inject(requiredStar, 'after');
		
		if(el.getSelected().get('value') == '') {
			requiredStar.addClass('required_select');
		}
		
		el.addEvent('change', function() {
			if(el.getSelected().get('value') == '') {
				requiredStar.addClass('required_select');
			} else {
				requiredStar.removeClass('required_select');
			}
		});
	});
}

window.addEvent('domready', function() {
	// Add textfield labels
	addTextfieldLabels();
	
	// Add required stars
	addRequired();
	
	// Add confirm modals
	addConfirmFirst();
	
	// Add link-checks in textfield blur
	addLinkCheck();
	
	// Add open links in new windows
	addExternLinks();
	
	// Add growing texareas
	addGrowingTextareas();
	
	// Allow only numbers in a textfield
	$$('.onlyNumbers').each(function(el, index) {
		el.addEvent('keydown', function(evt) {
		    var e = event || evt; 
		    var charCode = e.which || e.keyCode;
		    if (charCode > 31 && (charCode < 48 || charCode > 57)) return false;
		    return true;
		});
	});
	
	
});

// Change button status to disabled or enabled	
function buttonStatus(id, status) {
	if (!$(id)) return;
	(status == 'disabled' || !status) ? $(id).addClass('disabled').set('disabled', true) : $(id).removeClass('disabled').set('disabled', false);
}

// Sets the width of all elements to the width of the widest
function adjustWidth(classes) {
	var width = 0;
	$$('.' + classes).each(function(el, index) {
		  if(el.getStyle('width').toInt() > width) {
			  width = el.getStyle('width').toInt();
		  }
	  });
	$$('.' + classes).each(function(el, index) {
		el.setStyle('width', width + 'px');
	});
}

// Get Scrollbar width
var scroll_bar_width = null;
function getScrollBarWidth () {  
	if (scroll_bar_width != null) return scroll_bar_width;
	var inner = new Element('p').setStyles({'width': '100%', 'height': '200px'});
	var outer = new Element('div').setStyles({'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'width': '200px', 'height': '150px', 'visibility' : 'hidden'});  
	inner.inject(outer);  
	outer.inject(document.body, 'bottom'); 
	var w1 = inner.offsetWidth;  
	outer.setStyle('overflow', 'scroll');
	var w2 = inner.offsetWidth;  
	if (w1 == w2) w2 = outer.clientWidth;    
	outer.destroy();    
	scroll_bar_width = (w1 - w2);  
	return scroll_bar_width;
}; 

// Get Scrollbar height
var scroll_bar_height = null;
function getScrollBarHeight () {  
	if (scroll_bar_width != null) return scroll_bar_height;
	var inner = new Element('p').setStyles({'width': '300px', 'height': '100%'});
	var outer = new Element('div').setStyles({'position' : 'absolute', 'top' : '0px', 'left' : '0px', 'width': '200px', 'height': '200px', 'visibility' : 'hidden'});  
	inner.inject(outer);  
	outer.inject(document.body, 'bottom'); 
	var w1 = inner.offsetHeight;  
	outer.setStyle('overflow', 'scroll');
	var w2 = inner.offsetHeight;  
	if (w1 == w2) w2 = outer.clientHeight;  
	outer.destroy();    
	scroll_bar_height = (w1 - w2);  
	return scroll_bar_height;
};

// Shows or closes the ajax message
function ajax_message_open(message, error) {
	addLayer();
	if ($(window).retrieve('ajax_message') != null) {
		$(window).retrieve('ajax_message').destroy();
	}
	var ajax_message = new LightFace({
		content: '<div id="ajax_message_div" style="padding:25px 25px 25px 80px; font-size:16px" class="loader"><span id="ajax_message_span" style="visibility:hidden"></span></div>'	
	});	
	
	$('ajax_message_span').set('html', message);
	$('ajax_message_div').removeClass('message_ok').removeClass('message_error').removeClass('green').removeClass('red').addClass('loader');
	$('ajax_message_span').setStyle('visibility', 'hidden');
	ajax_message.open();
	
	$(window).store('ajax_message', ajax_message);	
}
function ajax_message_close_delay(success) {
	removeLayer();
	var temp_msg = ($(window).retrieve('ajax_message'));
	temp_msg.close();
	if(success) {
		success();
	}
}

function ajax_message_close(delay_msec, error, message, success) {
	if(!delay_msec && delay_msec != 0) {
		delay_msec = 1800;
	}
	var temp_msg = ($(window).retrieve('ajax_message'));
	
	if(temp_msg && temp_msg.isOpen) {
		$('ajax_message_div').removeClass('loader').addClass(error ? 'message_error red' : 'message_ok green');
		if(message) {
			$('ajax_message_span').set('html', message);
			temp_msg._position();
		}
		$('ajax_message_span').setStyle('visibility', 'visible');
		ajax_message_close_delay.delay(delay_msec, null, success);
	}
}
// Quick message no ajax
function quick_message(message, error, delay) {
	ajax_message_open();
	ajax_message_close(null, error, message);
}
// Quick error
function quick_error(msg) {
	ajax_message_open();
	ajax_message_close(null, true, msg || 'Es ist ein unbekannter Fehler aufgetreten.');
}
// Quick message with ajax call
function quick_ajax(file, params, messages, on, send_type) {
	var request = new Request({
		url: www + '/includes/system/ajax/' + file + '.php',
		method: send_type == 'get' ? 'get' : 'post',
		data: params,
		onFailure: function() { quick_error(); },
		onLoadstart: function() {
			if(on.loadstart) {
				on.loadstart();
			}
			if(messages.ok) {
				ajax_message_open();
			}
		},
		onSuccess: function(response) {
			if(messages.debug) {
				alert(response);
			}
			if(response == 1) {
				if(messages.ok) {
					ajax_message_close(messages.duration || null, false, messages.ok);
				}
				if(on.success) {
					on.success();
				}
			} else {
				if(messages.ok) {
					ajax_message_close(null, true, messages.error || 'Es ist ein unbekannter Fehler aufgetreten.');
				}
				if(on.failure) {
					on.failure();
				}
			}
			return response;
		}
	});
	request.send();
}

// Add required stars
function addRequired() {
	$$('.required_text').each(function(el, index) {
		if (el.hasClass('valid_email')) {
			if ((/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(el.value)) {
				el.removeClass('required_text');
			}
		} else {
			if(el.value != '') {
				el.removeClass('required_text');
			}
		}	
		el.addEvent('focus', function() {
			el.removeClass('required_text');
		}).addEvent('blur', function() {
			if (el.hasClass('valid_email')) {
				if (!(/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(el.value)) {
					el.addClass('required_text');
				}			
			} else {			
				if(el.value == '') {
					el.addClass('required_text');
				}
			}	
		});
	});
	
	$$('.required_select').each(function(el, index) {
		el.removeClass('required_select')
		
		el.setStyles({'float': 'left'});
		var requiredStar = new Element('div').setStyles({'float':'left', 'width':'12px', 'height': el.getStyle('height').toInt(), 'margin-top':'1px'}).inject(el, 'after');
		var clearFloat = new Element('div').setStyles({'clear':'both'}).inject(requiredStar, 'after');
		
		if(el.getSelected().get('value') == '') {
			requiredStar.addClass('required_select');
		}
		
		el.addEvent('change', function() {
			if(el.getSelected().get('value') == '') {
				requiredStar.addClass('required_select');
			} else {
				requiredStar.removeClass('required_select');
			}
		});
	});
}


// Add Element stuff // TODO Doesnt work
Element.implement({
  hasEvent: function(eventType,fn) {
    var myEvents = this.retrieve('events');
    return myEvents && myEvents[eventType] && (fn == undefined || myEvents[eventType].keys.contains(fn));
  }
});

String.implement('getNumber', function(){ 
	var string 		= this.replace(/\W/gi, '');
	var string 		= string.replace(/\s/gi, '');
	var string 		= string.replace(/_/gi, '');
	var no_numbers 	= string.replace(/\d/g, '');
	for (var i=0; i<= no_numbers.length; i++) {
		var string	=	string.replace(no_numbers.charAt(i), '');
	}
	return string.toInt();
});



function get_html_translation_table (table, quote_style) {
    // Returns the internal translation table used by htmlspecialchars and htmlentities  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/get_html_translation_table
    // +   original by: Philip Peterson
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: noname
    // +   bugfixed by: Alex
    // +   bugfixed by: Marco
    // +   bugfixed by: madipta
    // +   improved by: KELAN
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Frank Forte
    // +   bugfixed by: T.Wild
    // +      input by: Ratheous
    // %          note: It has been decided that we're not going to add global
    // %          note: dependencies to php.js, meaning the constants are not
    // %          note: real constants, but strings instead. Integers are also supported if someone
    // %          note: chooses to create the constants themselves.
    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
    var entities = {},
        hash_map = {},
        decimal = 0,
        symbol = '';
    var constMappingTable = {},
        constMappingQuoteStyle = {};
    var useTable = {},
        useQuoteStyle = {};
 
    // Translate arguments
    constMappingTable[0] = 'HTML_SPECIALCHARS';
    constMappingTable[1] = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
 
    useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
    useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';
 
    if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
        throw new Error("Table: " + useTable + ' not supported');
        // return false;
    }
 
    entities['38'] = '&amp;';
    if (useTable === 'HTML_ENTITIES') {
        entities['160'] = '&nbsp;';
        entities['161'] = '&iexcl;';
        entities['162'] = '&cent;';
        entities['163'] = '&pound;';
        entities['164'] = '&curren;';
        entities['165'] = '&yen;';
        entities['166'] = '&brvbar;';
        entities['167'] = '&sect;';
        entities['168'] = '&uml;';
        entities['169'] = '&copy;';
        entities['170'] = '&ordf;';
        entities['171'] = '&laquo;';
        entities['172'] = '&not;';
        entities['173'] = '&shy;';
        entities['174'] = '&reg;';
        entities['175'] = '&macr;';
        entities['176'] = '&deg;';
        entities['177'] = '&plusmn;';
        entities['178'] = '&sup2;';
        entities['179'] = '&sup3;';
        entities['180'] = '&acute;';
        entities['181'] = '&micro;';
        entities['182'] = '&para;';
        entities['183'] = '&middot;';
        entities['184'] = '&cedil;';
        entities['185'] = '&sup1;';
        entities['186'] = '&ordm;';
        entities['187'] = '&raquo;';
        entities['188'] = '&frac14;';
        entities['189'] = '&frac12;';
        entities['190'] = '&frac34;';
        entities['191'] = '&iquest;';
        entities['192'] = '&Agrave;';
        entities['193'] = '&Aacute;';
        entities['194'] = '&Acirc;';
        entities['195'] = '&Atilde;';
        entities['196'] = '&Auml;';
        entities['197'] = '&Aring;';
        entities['198'] = '&AElig;';
        entities['199'] = '&Ccedil;';
        entities['200'] = '&Egrave;';
        entities['201'] = '&Eacute;';
        entities['202'] = '&Ecirc;';
        entities['203'] = '&Euml;';
        entities['204'] = '&Igrave;';
        entities['205'] = '&Iacute;';
        entities['206'] = '&Icirc;';
        entities['207'] = '&Iuml;';
        entities['208'] = '&ETH;';
        entities['209'] = '&Ntilde;';
        entities['210'] = '&Ograve;';
        entities['211'] = '&Oacute;';
        entities['212'] = '&Ocirc;';
        entities['213'] = '&Otilde;';
        entities['214'] = '&Ouml;';
        entities['215'] = '&times;';
        entities['216'] = '&Oslash;';
        entities['217'] = '&Ugrave;';
        entities['218'] = '&Uacute;';
        entities['219'] = '&Ucirc;';
        entities['220'] = '&Uuml;';
        entities['221'] = '&Yacute;';
        entities['222'] = '&THORN;';
        entities['223'] = '&szlig;';
        entities['224'] = '&agrave;';
        entities['225'] = '&aacute;';
        entities['226'] = '&acirc;';
        entities['227'] = '&atilde;';
        entities['228'] = '&auml;';
        entities['229'] = '&aring;';
        entities['230'] = '&aelig;';
        entities['231'] = '&ccedil;';
        entities['232'] = '&egrave;';
        entities['233'] = '&eacute;';
        entities['234'] = '&ecirc;';
        entities['235'] = '&euml;';
        entities['236'] = '&igrave;';
        entities['237'] = '&iacute;';
        entities['238'] = '&icirc;';
        entities['239'] = '&iuml;';
        entities['240'] = '&eth;';
        entities['241'] = '&ntilde;';
        entities['242'] = '&ograve;';
        entities['243'] = '&oacute;';
        entities['244'] = '&ocirc;';
        entities['245'] = '&otilde;';
        entities['246'] = '&ouml;';
        entities['247'] = '&divide;';
        entities['248'] = '&oslash;';
        entities['249'] = '&ugrave;';
        entities['250'] = '&uacute;';
        entities['251'] = '&ucirc;';
        entities['252'] = '&uuml;';
        entities['253'] = '&yacute;';
        entities['254'] = '&thorn;';
        entities['255'] = '&yuml;';
    }
 
    if (useQuoteStyle !== 'ENT_NOQUOTES') {
        entities['34'] = '&quot;';
    }
    if (useQuoteStyle === 'ENT_QUOTES') {
        entities['39'] = '&#39;';
    }
    entities['60'] = '&lt;';
    entities['62'] = '&gt;';
 
 
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal);
        hash_map[symbol] = entities[decimal];
    }
 
    return hash_map;
}

function html_entity_decode (string, quote_style) {
    // Convert all HTML entities to their applicable characters  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/html_entity_decode
    // +   original by: john (http://www.jd-tech.net)
    // +      input by: ger
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   improved by: marc andreu
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Ratheous
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Nick Kolosov (http://sammy.ru)
    // +   bugfixed by: Fox
    // -    depends on: get_html_translation_table
    // *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
    // *     returns 1: 'Kevin & van Zonneveld'
    // *     example 2: html_entity_decode('&amp;lt;');
    // *     returns 2: '&lt;'
    var hash_map = {},
        symbol = '',
        tmp_str = '',
        entity = '';
    tmp_str = string.toString();
 
    if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) {
        return false;
    }
 
    // fix &amp; problem
    // http://phpjs.org/functions/get_html_translation_table:416#comment_97660
    delete(hash_map['&']);
    hash_map['&'] = '&amp;';
 
    for (symbol in hash_map) {
        entity = hash_map[symbol];
        tmp_str = tmp_str.split(entity).join(symbol);
    }
    tmp_str = tmp_str.split('&#039;').join("'");
 
    return tmp_str;
}

function htmlentities (string, quote_style) {
    // Convert all applicable characters to HTML entities  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/htmlentities
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: nobbler
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Ratheous
    // -    depends on: get_html_translation_table
    // *     example 1: htmlentities('Kevin & van Zonneveld');
    // *     returns 1: 'Kevin &amp; van Zonneveld'
    // *     example 2: htmlentities("foo'bar","ENT_QUOTES");
    // *     returns 2: 'foo&#039;bar'
    var hash_map = {},
        symbol = '',
        tmp_str = '',
        entity = '';
    tmp_str = string.toString();
 
    if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) {
        return false;
    }
    hash_map["'"] = '&#039;';
    for (symbol in hash_map) {
        entity = hash_map[symbol];
        tmp_str = tmp_str.split(symbol).join(entity);
    }
 
    return tmp_str;
}

function trim_texts(class_name) {
	$$('.' + class_name).each(function(element) {
	
		element.set('html', element.get('html').replace(new RegExp("&lt;", "g"), "˄"));
		element.set('html', element.get('html').replace(new RegExp("&rt;", "g"), "˅"));

		
		var child = element;
		while (child.getChildren().length > 0) {
			var temp = child.getChildren();
			child = temp[0];		
		}
		child.setStyle('word-wrap', 'break-word');
		element.store('initial_html', html_entity_decode(child.get('html')));		
		element.store('initial_text', element.get('text'));
		element.setStyle('visibility', 'hidden');
		element.set('html', element.get('html').replace(element.get('text'), '&nbsp;'));	
		element.setStyle('overflow', 'scroll');
		element.store('initial_height', element.getScrollSize().y);		
		element.trim_text = function(text, truncated) {			
			if (truncated) {
				this.set('html', this.retrieve('initial_html').replace(this.retrieve('initial_text'), (text.clean() + '...')));
			} else {
				this.set('html', this.retrieve('initial_html').replace(this.retrieve('initial_text'), text ));
			}		
			if (this.retrieve('initial_height').toInt() < this.getScrollSize().y.toInt()) {
				/*this.trim_text(text.substr(0, (text.length - 1)), true);
				return;*/
				var decoded = html_entity_decode(text);
				this.trim_text(htmlentities(decoded.substr(0, (decoded.length - 1))), true);			
				return;
			} else {
				this.setStyle('visibility', 'visible');
				this.setStyle('overflow', 'hidden');
				return;
			}				
		}			
		window.addEvent('load', function() {
			element.trim_text(element.retrieve('initial_text'), false);
			element.set('html', element.get('html').replace(new RegExp("˄", "g"), "&lt;"));
			element.set('html', element.get('html').replace(new RegExp("˅ ", "g"), "&rt;"));					
		}, this);	

	});	
}	
