function htmlspecialchars_decode (string, quote_style) {
    // Convert special HTML entities back to characters  
    // 
    // version: 911.2923
    // discuss at: http://phpjs.org/functions/htmlspecialchars_decode
    // +   original by: Mirek Slugen
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Mateusz "loonquawl" Zalega
    // +      input by: ReverseSyntax
    // +      input by: Slawomir Kaniecki
    // +      input by: Scott Cariss
    // +      input by: Francois
    // +   bugfixed by: Onno Marsman
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Ratheous
    // +      input by: Mailfaker (http://www.weedem.fr/)
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: htmlspecialchars_decode("<p>this -&gt; &quot;</p>", 'ENT_NOQUOTES');
    // *     returns 1: '<p>this -> &quot;</p>'
    // *     example 2: htmlspecialchars_decode("&amp;quot;");
    // *     returns 2: '&quot;'
    var optTemp = 0, i = 0, noquotes= false;
    if (typeof quote_style === 'undefined') {
        quote_style = 2;
    }
    string = string.toString().replace(/&lt;/g, '<').replace(/&gt;/g, '>');
    var OPTS = {
        'ENT_NOQUOTES': 0,
        'ENT_HTML_QUOTE_SINGLE' : 1,
        'ENT_HTML_QUOTE_DOUBLE' : 2,
        'ENT_COMPAT': 2,
        'ENT_QUOTES': 3,
        'ENT_IGNORE' : 4,
    };
    if (quote_style === 0) {
        noquotes = true;
    }
    if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
        quote_style = [].concat(quote_style);
        for (i=0; i < quote_style.length; i++) {
            // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
            if (OPTS[quote_style[i]] === 0) {
                noquotes = true;
            }
            else if (OPTS[quote_style[i]]) {
                optTemp = optTemp | OPTS[quote_style[i]];
            }
        }
        quote_style = optTemp;
    }
    if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
        string = string.replace(/&#0*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should
        // string = string.replace(/&apos;|&#x0*27;/g, "'"); // This would also be useful here, but not a part of PHP
    }
    if (!noquotes) {
        string = string.replace(/&quot;/g, '"');
    }
    // Put this in last place to avoid escape being double-decoded
    string = string.replace(/&amp;/g, '&');
 
    return string;
}

function removeQuotes(str){
	charToRemove = '"';
	regExp = new RegExp("["+charToRemove+"]","g");
	return str.replace(regExp,"");
}

function init_forms(){

	if(q==""){
		$("#q").defaultvalue(q_init);
	}
	
	$('#form_addfeed').submit(function(e) {
			$('#url').addClass('url_loading');
			$('.url').attr('disabled', 'disabled'); // disable 

			e.preventDefault();
			$.post("/form_addfeed", { url: $("#url").val() }, function (data) {
				var timeout = 4000;
				if(data.type=='success'){ $('#url').val('http://'); timeout = timeout*2; }
				$('#url').removeClass('url_loading');
				$('.url').removeAttr('disabled'); // enable 

				var msg = $('<p style="margin:1em 0 0 0;" class="'+data.type+'">'+data.txt+'</p>').hide();
				msg.appendTo('#form_addfeed').slideDown('fast');
				setTimeout(function () {
					$('#form_addfeed .'+data.type).slideUp(function(){
						$(this).remove();
					});
				}, timeout);
				
			},'json');
		});
}

function init_items(){
	
	if(q!='' && q!=q_init){
		jQuery(document).SearchHighlight( {keys:removeQuotes(q), exact:"exact", style_name_suffix:false, style_name:"highlight", highlight:".item .title, .item .desc"} );
	}

	$(".item").hover(
		function(){
			if ($(this).children('.desc').is(":hidden")) {
				$(this).children('.buttons').slideDown(120);
			}
		},
		function(){
			if ($(this).children('.desc').is(":hidden")) {
				$(this).children('.buttons').slideUp(120);
			}
		});

		$('.item').click(
			function(){
				if ( $(this).children('.desc').is(":hidden") ) {
					$(this).children('.buttons').children('.more').css('background-color', 'white');
				}else{
					$(this).children('.buttons').children('.more').css('background-color', '#f1f1e9');				
				}
				$(this).find('.buttons .more').click();				
			});
		
		$('.item a').click(
			function(event){
				event.stopPropagation();
			});
						
		$('.item .buttons .more').click(
			function(event){
				event.stopPropagation();
				if ( $(this).parent().parent().children('.desc').is(":hidden") ) {
					$(this).text('x');
					$(this).parent().parent().animate( { backgroundColor:'#f1f1e9'}, 120);
					$(this).hover(function(){
					    this.style.backgroundColor = "#00aaff";
					}, function() {
					    this.style.backgroundColor = "white";
					});
										
				}else{
					$(this).text('+');
					$(this).parent().parent().animate( { backgroundColor:'#ffffff'}, 120);
					$(this).hover(function(){
					    this.style.backgroundColor = "#00aaff";
					}, function() {
					    this.style.backgroundColor = "#f1f1e9";
					});
				}
				$(this).parent().parent().children('.desc').slideToggle("fast");
			}
		);
		
		$('.item .buttons .inactive').click(
			function(event){
				event.preventDefault(); // make href inactive
				var url = $(this).attr('href');
				var answer = confirm('Make this item inactive?');
				if(answer==true){
					var item = $(this).parent().parent();
					$.get( url, {},
						function(data, textStatus){
							if(data == true && textStatus=='success'){
								item.slideUp("slow");
							}else{ 
								alert('Something went wrong. Item not inactive.'); 
							}
				  		},'json');
				}
			}
		);
}
