function urlencode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // %          note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'

    var histogram = {}, unicodeStr='', hexEscStr='';
    var ret = (str+'').toString();

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The histogram is identical to the one in urldecode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    histogram['\u00DC'] = '%DC';
    histogram['\u00FC'] = '%FC';
    histogram['\u00C4'] = '%D4';
    histogram['\u00E4'] = '%E4';
    histogram['\u00D6'] = '%D6';
    histogram['\u00F6'] = '%F6';
    histogram['\u00DF'] = '%DF';
    histogram['\u20AC'] = '%80';
    histogram['\u0081'] = '%81';
    histogram['\u201A'] = '%82';
    histogram['\u0192'] = '%83';
    histogram['\u201E'] = '%84';
    histogram['\u2026'] = '%85';
    histogram['\u2020'] = '%86';
    histogram['\u2021'] = '%87';
    histogram['\u02C6'] = '%88';
    histogram['\u2030'] = '%89';
    histogram['\u0160'] = '%8A';
    histogram['\u2039'] = '%8B';
    histogram['\u0152'] = '%8C';
    histogram['\u008D'] = '%8D';
    histogram['\u017D'] = '%8E';
    histogram['\u008F'] = '%8F';
    histogram['\u0090'] = '%90';
    histogram['\u2018'] = '%91';
    histogram['\u2019'] = '%92';
    histogram['\u201C'] = '%93';
    histogram['\u201D'] = '%94';
    histogram['\u2022'] = '%95';
    histogram['\u2013'] = '%96';
    histogram['\u2014'] = '%97';
    histogram['\u02DC'] = '%98';
    histogram['\u2122'] = '%99';
    histogram['\u0161'] = '%9A';
    histogram['\u203A'] = '%9B';
    histogram['\u0153'] = '%9C';
    histogram['\u009D'] = '%9D';
    histogram['\u017E'] = '%9E';
    histogram['\u0178'] = '%9F';

    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);

    for (unicodeStr in histogram) {
        hexEscStr = histogram[unicodeStr];
        ret = replacer(unicodeStr, hexEscStr, ret); // Custom replace. No regexing
    }

    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
}

function language_change(newLng)
{
	window.top.location="/" + newLng;
}

if(dojo.isIE)
{
	//Saving a copy of the original function.
	var origAddOnLoad=dojo.addOnLoad;
	//Wrapping it.
	dojo.addOnLoad=function()
	{
		var args=arguments;
		if(document.readyState=="complete")
		{
			//Document is loaded. Removing the wrapper.
			dojo.addOnLoad=origAddOnLoad;
			dojo.addOnLoad.apply(dojo,args);
		}
		else
		{
			//Document not loaded yet. Deferring execution.
			setTimeout(function(){dojo.addOnLoad.apply(dojo,args);},10);
		}
	};
}


function eventHandling(element,type,callBack,returnParams) {
	/*
	  * eventhandler festlegen
	  */
	var returnParams = returnParams;

	if(document.addEventListener) { //gute Browser
		if(type.match(/^on/)) type = type.replace(/^on/,"");
			element.addEventListener(type,handleEvent,false);
	} else { // IE
		if(!type.match(/^on/))	type = "on"+type;
			element.attachEvent(type,handleEvent);
	}

	function handleEvent (evt) {
		var event  = (evt)?evt:(window.event)?window.event:'';

			if(event.stopPropagation) {
				event.stopPropagation();
			} else {
				event.cancelBubble = true;
			}

			var target = event.srcElement || event.currentTarget;

		callBack.call(callBack,event,target,(returnParams)?returnParams:null);
	}
}




function setOpacity ( obj , opacity )
{
	opacity = (opacity == 100)?99.999:opacity;
	// IE/Win
	obj.style.filter = "alpha(opacity:"+opacity+")";
	// Safari<1.2, Konqueror
	obj.style.KHTMLOpacity = opacity/100;
	// Older Mozilla and Firefox
	obj.style.MozOpacity = opacity/100;
	// Safari 1.2, newer Firefox and Mozilla, CSS3
	obj.style.opacity = opacity/100;
}

var _ajaxLoaderConnects = new Array();
function showAjaxLoader()
{
	dojo.require("dijit.DialogUnderlay");

	var underlayAttrs = {
		dialogId: 'dlgAjaxLoader',
		"class": "ajaxLoaderUnderlay"
	};

	var underlay = dijit._underlay;
	if(!underlay){
		underlay = dijit._underlay = new dijit.DialogUnderlay(underlayAttrs);
	}

	underlay.attr(underlayAttrs);
	underlay.show();
	_ajaxLoaderConnects.push(dojo.connect(window, "onresize", dijit._underlay, "layout"));
	_ajaxLoaderConnects.push(dojo.connect(window, "onscroll", dijit._underlay, "layout"));

	document.getElementById("dlgAjaxLoader").style.display = "block";
}

function appendAjaxLoader(appendTo)
{
	dojo.byId(appendTo).appendChild(dojo.byId('dlgAjaxLoader'));
	dojo.style('dlgAjaxLoader', 'display', 'block');
}

function hideAjaxLoader()
{
	dijit._underlay.hide();
	dojo.forEach(_ajaxLoaderConnects, dojo.disconnect);
	document.getElementById("dlgAjaxLoader").style.display = "none";
}

var glooobleConfirmDlg;
function glooobleConfirm(question, button1text, button1action, button2text, button2action)
{
	button1action = glooobleConfirm_getAction(button1action);
	button2action = glooobleConfirm_getAction(button2action);
		

	llontent = '<div style="min-width: 150px; max-width: 300px;">';
	llontent += '<p style="text-align: justify;">'+ question +'</p>';
	llontent += '<div style="border-top: 1px solid grey; margin-top: 20px; padding-top: 3px;">';
	llontent += '<div style="float: left;"><button class="button" type="button" onClick="'+ button1action +'">'+ button1text +'</button></div>';
	llontent += '<div style="text-align: right;"><button class="button" type="button" onClick="'+ button2action +'">'+ button2text +'</button></div>';
	llontent += '</div>';
	llontent += '</div>';
	dojo.require("dijit.Dialog");
	glooobleConfirmDlg = new dijit.Dialog({
								content: llontent,
								duration: 500
						});
	dojo.body().appendChild(glooobleConfirmDlg.domNode);
	glooobleConfirmDlg.show();
	return;
}


function glooobleConfirm_getAction(str)
{
	var parts = str.split('::');
	switch(parts[0])
	{
		case 'close':
			return 'glooobleConfirmDlg.hide();';
			
		case 'autoRedir':
			return "appendAjaxLoader(glooobleConfirmDlg.domNode); location.href='" + parts[1] +"';";
			
		default:
			return parts[0] + 'glooobleConfirmDlg.hide();'
	}	
}

function JSNavbar( current_page, pages, range, link)
{
	var next_page = current_page;
	var prev_page = current_page;
	next_page++;
	prev_page--;

	if(next_page >= pages) next_page = 0;
	if(prev_page < 0) prev_page = pages-1;

	var Navbar = document.createElement("table");
	Navbar.style.marginTop = "15px";
	Navbar.style.marginBottom = "15px";
	Navbar.cellPadding = "0";
	Navbar.cellSpacing = "0";
	Navbar.border = "0";
	Navbar.align = "center";

	var TableRow = document.createElement("tr");

	var TableTd = document.createElement("td");
	TableTd.className = "Navbar_next";
	TableTd.align = "center";
	TableTd.vAlign = "center";
	TableTd.style.paddingRight = "5px";

	var TextNode = document.createTextNode("  ");

	if(pages > 0)
	{
		var BackLink = document.createElement("a");
		BackLink.href = link.replace("%count%",prev_page);
		BackLink.innerHTML = rb_locale["MAIN_PAGENAV_BACK"];
		TableTd.appendChild(BackLink);
	}

	TableTd.appendChild(TextNode);

	TableRow.appendChild(TableTd);

	var forRange = Math.floor(current_page-(range/2));

	if(forRange <= 0) forRange = 0;

	var to = forRange+range;
	var for_subtract = to-(pages-1);
	if(to > (pages-1))
	{
		to = pages-1;
		forRange = forRange - for_subtract;
		if(forRange <= 0) forRange = 0;
	}

	for(var i = forRange;i <= to;i++)
	{

		var i_print = i+1;
		if(i_print < 10)
		{
			i_print = "0"+i_print;
		}

		var NavbarLink = document.createElement("td");
		NavbarLink.align = "center";
		NavbarLink.vAlign = "center";
		NavbarLink.width = "20";

		var TableTd = document.createElement("td");
		TableTd.align = "center";
		TableTd.vAlign = "center";

		var NavbarALink = "";
		if (i==current_page)
		{
			NavbarALink = document.createElement("span");
			NavbarALink.className = "Navbar_selected";
			NavbarALink.innerHTML = ""+i_print;
		}
		else
		{
			NavbarALink = document.createElement("a");
			NavbarALink.innerHTML = ""+i_print;
			NavbarALink.href = link.replace("%count%",i);
		}

		NavbarLink.appendChild(NavbarALink);
		TableTd.appendChild(NavbarLink);
		TableRow.appendChild(TableTd);
	}

	var TableTd = document.createElement("td");
	TableTd.className = "Navbar_next";
	TableTd.align = "center";
	TableTd.vAlign = "center";
	TableTd.style.paddingLeft = "5px";


	var TextNode = document.createTextNode("  ");

	TableTd.appendChild(TextNode);

	if(pages > 0)
	{
		var BackLink = document.createElement("a");
		BackLink.href = link.replace("%count%",next_page);
		BackLink.innerHTML = rb_locale["MAIN_PAGENAV_FORWARD"];
		TableTd.appendChild(BackLink);
	}


	TableRow.appendChild(TableTd);

	if(pages == 1)
	{
		return "";
	}

	Navbar.appendChild(TableRow);

	var TmpElement = document.createElement("span");
	TmpElement.appendChild(Navbar);
	return TmpElement.innerHTML;
}



function strrpos( haystack, needle, offset){
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // *     example 1: strrpos('Kevin van Zonneveld', 'e');
    // *     returns 1: 16
 
    var i = (haystack+'').lastIndexOf( needle, offset ); // returns -1
    return i >= 0 ? i : false;
}


function substr( f_string, f_start, f_length ) {
    // http://kevin.vanzonneveld.net
    // +     original by: Martijn Wieringa
    // +     bugfixed by: T.Wild
    // +      tweaked by: Onno Marsman
    // *       example 1: substr('abcdef', 0, -1);
    // *       returns 1: 'abcde'
    // *       example 2: substr(2, 0, -6);
    // *       returns 2: ''
 
    f_string += '';
 
    if(f_start < 0) {
        f_start += f_string.length;
    }
 
    if(f_length == undefined) {
        f_length = f_string.length;
    } else if(f_length < 0){
        f_length += f_string.length;
    } else {
        f_length += f_start;
    }
 
    if(f_length < f_start) {
        f_length = f_start;
    }
 
    return f_string.substring(f_start, f_length);
}

function in_array(needle, haystack, argStrict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
 
    var found = false, key, strict = !!argStrict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}

function trim (zeichenkette)
{
  return zeichenkette.replace (/^\s+/, '').replace (/\s+$/, '');
}

function getElementPos(el)
{
	if (el)
	{
		for (var lx=0, ly=0; el!=null;lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
			return new Array(lx, ly);
	}
	return false;
}

function getElementSize(el)
{
	if (el)
	{
		var w = el.style.width;
		var h = el.style.height;
		var posW = w.indexOf("p");
		var posH = h.indexOf("p");
		w = parseInt(w.substring(0,posW));
		h = parseInt(h.substring(0,posH));

			return new Array(w, h);
	}
	return false;
}

function getEventOffsetXY( evt )
{
	if ( evt.offsetX != null )
		return [ evt.offsetX , evt.offsetY ];

    var obj = evt.target || evt.srcElement;
   	setPageTopLeft( obj );
    return [ ( evt.clientX - obj.pageLeft ) , ( evt.clientY - obj.pageTop ) ];
};

function setPageTopLeft( o )
{
    var top = 0,
    left = 0,
    obj = o;

    while ( o.offsetParent )
     {
         left += o.offsetLeft ;
         top += o.offsetTop ;
         o = o.offsetParent ;
    };

    obj.pageTop = top;
    obj.pageLeft = left;

};

function strlen (string) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Sakimori
    // +      input by: Kirk Strobeck
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +    revised by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: May look like overkill, but in order to be truly faithful to handling all Unicode
    // %        note 1: characters and to this function in PHP which does not count the number of bytes
    // %        note 1: but counts the number of characters, something like this is really necessary.
    // *     example 1: strlen('Kevin van Zonneveld');
    // *     returns 1: 19
    // *     example 2: strlen('A\ud87e\udc04Z');
    // *     returns 2: 3
 
    var str = string+'';
    var i = 0, chr = '', lgth = 0;
 
    var getWholeChar = function (str, i) {
        var code = str.charCodeAt(i);
        var next = '', prev = '';
        if (0xD800 <= code && code <= 0xDBFF) { // High surrogate(could change last hex to 0xDB7F to treat high private surrogates as single characters)
            if (str.length <= (i+1))  {
                throw 'High surrogate without following low surrogate';
            }
            next = str.charCodeAt(i+1);
            if (0xDC00 > next || next > 0xDFFF) {
                throw 'High surrogate without following low surrogate';
            }
            return str[i]+str[i+1];
        } else if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
            if (i === 0) {
                throw 'Low surrogate without preceding high surrogate';
            }
            prev = str.charCodeAt(i-1);
            if (0xD800 > prev || prev > 0xDBFF) { //(could change last hex to 0xDB7F to treat high private surrogates as single characters)
                throw 'Low surrogate without preceding high surrogate';
            }
            return false; // We can pass over low surrogates now as the second component in a pair which we have already processed
        }
        return str[i];
    };
 
    for (i=0, lgth=0; i < str.length; i++) {
        if ((chr = getWholeChar(str, i)) === false) {
            continue;
        } // Adapt this line at the top of any loop, passing in the whole string and the current iteration and returning a variable to represent the individual character; purpose is to treat the first part of a surrogate pair as the whole character and then ignore the second part
        lgth++;
    }
    return lgth;
}



function tipQuote(str) {
    return (str+'').replace(/([\\'])/g, "\\$1").replace(/"/g, "&quot;");
}




function getAsLocalNumberFormat(translationObject, number)
{
	if(number == undefined || number == null)
	{
		return false;
	}
	var otherK;
	for(var key in translationObject)
	{
		if(translationObject.hasOwnProperty(key))
		{
			if(key == number)
			{
				return translationObject[key];
			}
			if(key == "other")
			{
				otherK = key;
			}
		}		
		
	}
	if(otherK != undefined && otherK != "")
	{
		return translationObject[otherK];
	}
	return null;
}


function forceScrollBottom(divName)
{
	mydiv = document.getElementById(divName);

	if(mydiv == null || mydiv == undefined)
	{
		return;
	}
	//var debug = "ScrollTop: " + mydiv.scrollTop;
	for (i = 50; i < mydiv.scrollHeight; i += 50)
	{
		var tmp = mydiv.scrollTop;
		// pre-store scrollTop
		mydiv.scrollTop += i;
		// update scrollTop
		if (tmp == mydiv.scrollTop)
		{
			break;
		}
		//debug += i + "ScrollTop: " + mydiv.scrollTop + "\n";
	}
	//alert(debug);
}




function change_status()
{
	dojo.xhrPost(
	{
		url: "/"+ LANG +"/ajax/changeUserStatus",
		handleAs: 'json',
		content:
		{
			newStatus: dijit.byId('changeStatus').attr('value')
		},
		load: function(result)
		{
			if(result.error != "")
			{
				alert(result.error);
			}
			else
			{
					document.getElementById("currentUserStatusImg").src = "/templates/standard/"+result.statusImg;
			}
		}

	});
}

function sendContact(result)
{
	dojo.xhrPost(
	{
		url: "/"+ LANG +"/ajax/sendContact",
		handleAs:"json",
		content:
		{
			reasonType: result.reasonTyp,
			message: result.reasonMsg,
			name: result.name,
			firstname: result.firstname,
			cemail: result.cemail,
			subject: result.subject,
			reportURI: window.location.href
		},
		load: function(jsonResult) {
			alert(jsonResult.message);
		}
	});
}

function sendAprovement(result)
{
	dojo.xhrPost(
	{
		url:"/"+ LANG +"/ajax/sendAprovements",
		handleAs:"json",
		content:
		{
			msg: result.aprovementMsg,
			reportURI: window.location.href
		},
		load: function(jsonResult) {
			alert(jsonResult.message);
		}
	});
}
