/**
 * Add the String.format functionality if it is not already defined
 */
if(String.format == undefined)
{
	String.prototype.format = function(){
	    var pattern = /\{\d+\}/g;
	    var args = arguments;
	   
	    return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
	};
	
	String.format = function(){
		
		var string = new String();
		var args = new Array();
		for(var $i = 0 ; $i < arguments.length ; $i++)
		{
			if($i == 0)
				string = arguments[$i];
			else
				args[$i-1] = arguments[$i];
		}
		
		var pattern = /\{\d+\}/g;
	   
	    return string.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
	}
}

window.isNumeric = function(sText)
{
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;

	for (i = 0; i < sText.length && IsNumber == true; i++) 
	{ 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) 
		{
			IsNumber = false;
		}
	}
	return IsNumber;
}



var resizeTextAreaMemory = new Array();
function resizeTextArea(elm) {
	if (!elm) return;
	
	if(!resizeTextAreaMemory[elm]) {
		resizeTextAreaMemory[elm] = elm.rows;
	}

	var lineBreaks = countLineBreaks(elm.value);
	var newRows = 0;
	var minRows = resizeTextAreaMemory[elm];
	var maxRows = 20;
	
	if(lineBreaks < minRows) lineBreaks = minRows;
	if(lineBreaks > maxRows) lineBreaks = maxRows;
	elm.rows = lineBreaks;
	
}

function maxlengthTextArea(node, int) {
	var newValue;
	var value = node.value;
	var length = value.length;
	var nodeID = node.id;
	if(nodeID != "") {
		var counterID = '#' + nodeID + "_counter";
		var counterNode = $(counterID);
		if(typeof(counterNode) != "undefined") {
			var rest = int-length;
			if(rest < 0) rest = 0;
			counterNode.html(rest);
		}
	}
	if(length > int) {
		newValue = value.substring(0, int);
		node.value = newValue;
	}
}

function countLineBreaks(textstring) {
	var count = textstring.split('\n').length;
	return count;
}

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;
}

/**
 * holt cookie-Wert
 * 
 * @param cookie-Name
 * @return cookie-Wert/ false
 */
function getCookie(cookieName) {
	strValue = false;

	if( strCookie = document.cookie ) {
        if( arrCookie = strCookie.match( new RegExp( cookieName + '=([^;]*)', 'g')))  {
        	strValue=RegExp.$1;
        }
    }
	return(strValue);
}

/**
 * setzt cookie
 * 
 * @param cookie-Name,cookie-Wert,Haltbarkeit
 *            in Tagen
 * @return true/false
 */
function setCookie(cookieName, cookieValue, intDays) {
	if(!isCookieEnabled()) {
		return false;
	}
    
	var cookieString = cookieName + '=' + cookieValue + ';';
	if(intDays > 0) {
		objNow = new Date();
		strExp = new Date( objNow.getTime() + ( intDays * 86400000) );
		var cookieString = cookieString + 'expires=' + strExp.toGMTString() + ';';
	}
	document.cookie = cookieString;
	return true;
}

/**
 * L�scht cookie
 * 
 * @param cookie-Name
 * @return true/false
 */
function deleteCookie(cookieName) {
	if(document.cookie){ 
		document.cookie = cookieName + '=' + get_cookie(cookieName) + ';expires=Thu, 01-Jan-1970 00:00:01 GMT;'; 
        return true;
    }
	return false;
}

/**
 * pr�ft ob cookies erlaubt sind
 * 
 * @param nix
 * @return true/false
 */
function isCookieEnabled() {
	if(typeof navigator.cookieEnabled!='undefined') {
        return navigator.cookieEnabled;
    }

	set_cookie('testcookie','testwert',1);

	if(!document.cookie) {
		return false;
	}

	delete_cookie('testcookie');
	return true;        
}

function randomInt() {
	var temp = (Math.random() * 60000) + 40000;
	var zahl = Math.round(temp);
	return zahl;
}


/**
 * Calculate the md5 hash of a string
 * 
 * @param string
 * @return string
 */
function md5 (str) {
    var xl;
 
    var rotateLeft = function (lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    };
 
    var addUnsigned = function (lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    };
 
    var _F = function (x,y,z) { return (x & y) | ((~x) & z); };
    var _G = function (x,y,z) { return (x & z) | (y & (~z)); };
    var _H = function (x,y,z) { return (x ^ y ^ z); };
    var _I = function (x,y,z) { return (y ^ (x | (~z))); };
 
    var _FF = function (a,b,c,d,x,s,ac) {
        a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));
        return addUnsigned(rotateLeft(a, s), b);
    };
 
    var _GG = function (a,b,c,d,x,s,ac) {
        a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));
        return addUnsigned(rotateLeft(a, s), b);
    };
 
    var _HH = function (a,b,c,d,x,s,ac) {
        a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));
        return addUnsigned(rotateLeft(a, s), b);
    };
 
    var _II = function (a,b,c,d,x,s,ac) {
        a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));
        return addUnsigned(rotateLeft(a, s), b);
    };
 
    var convertToWordArray = function (str) {
        var lWordCount;
        var lMessageLength = str.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=new Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };
 
    var wordToHex = function (lValue) {
        var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            wordToHexValue_temp = "0" + lByte.toString(16);
            wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);
        }
        return wordToHexValue;
    };
 
    var x=[],
        k,AA,BB,CC,DD,a,b,c,d,
        S11=7, S12=12, S13=17, S14=22,
        S21=5, S22=9 , S23=14, S24=20,
        S31=4, S32=11, S33=16, S34=23,
        S41=6, S42=10, S43=15, S44=21;
 
    // str = this.utf8_encode(str);
    x = convertToWordArray(str);
    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
    
    xl = x.length;
    for (k=0;k<xl;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=_FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=_FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=_FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=_FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=_FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=_FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=_FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=_FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=_FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=_FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=_GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=_GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=_GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=_GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=_GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=_GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=_GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=_GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=_GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=_GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=_GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=_HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=_HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=_HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=_HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=_HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=_HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=_HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=_HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=_HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=_HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=_II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=_II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=_II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=_II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=_II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=_II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=_II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=_II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=_II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=_II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=addUnsigned(a,AA);
        b=addUnsigned(b,BB);
        c=addUnsigned(c,CC);
        d=addUnsigned(d,DD);
    }
 
    var temp = wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);
 
    return temp.toLowerCase();
}

/*
SystemCall
- sendet einen standard Ajax.Request an das System
*/
function SystemCall($params , $link, $text)
{
	$.ajax({
		url :"index.php?async=1",  
		type:'POST',
		data: $params,
		success: function(transport){
			if($params.method == 'createFavor')
				favorCallback(transport , $params , $link, $text);
			else if($params.method == 'deleteFavor')
				favorCallback(transport , $params , $link, $text);
			else if($params.method == 'getFavorBoxText')
				updateBoxTextCallback(transport , $params.m_key , $params.i_key)
		},
		error : function(){alert("Fehler! Lieber Benutzer, leider ist aufgrund eines technischen Fehlers die letzte Anfrage fehlgeschlagen und konnte nicht ausgeführt werden. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support.");},
	});
}

/*
 * Fenstergröße ermitteln, nutzbare
 */
function getSize() {
	var myWidth = 0, myHeight = 0;
	var myReturn = new Array();

	if( typeof( window.width() ) == 'number' ) {
		//Non-IE
		myReturn['width'] = window.width();
		myReturn['height'] = window.height();
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myReturn['width'] = document.documentElement.clientWidth;
		myReturn['height'] = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myReturn['width'] = document.body.clientWidth;
		myReturn['height'] = document.body.clientHeight;
	}
	return myReturn;
}

/*
 * diese funktion erstellt und löscht CommunityFavors
 */
function FavorCall($params)
{
	
	/* std texte */
	var $likeText = 'Find ich gut';
	var $unlikeText = 'Find ich nicht mehr gut';
	
	
	/* Favor anlegen */
	if($params.f_key == undefined)
	{
		
		/* link erstellen */
		var $link = 'FavorCall({m_key:'+$params.m_key+', a_key:'+$params.a_key+', i_key:'+$params.i_key+', f_key: {0}, p_key: '+$params.p_key+',mp_key:'+$params.mp_key+'})';
		
		/* CommunityFavor erstellen */
		SystemCall({method : 'createFavor', m_key: $params.m_key,a_key: $params.a_key , i_key: $params.i_key, p_key: $params.p_key, mp_key: $params.mp_key }, $link, $unlikeText);
		
	}
	
	/*	Favor löschen */ 
	if($params.f_key != undefined)
	{
		/* link erstellen */
		var $link = 'FavorCall({m_key:'+$params.m_key+', a_key:'+$params.a_key+', i_key:'+$params.i_key+', p_key: '+$params.p_key+',mp_key:'+$params.mp_key+'})';
		
		/* CommunityFavor erstellen */
		SystemCall({method : 'deleteFavor', m_key: $params.m_key,f_key: $params.f_key , i_key : $params.i_key, p_key: $params.p_key, mp_key: $params.mp_key }, $link, $likeText);
	}
}

function favorCallback($response , $params , $link, $text)
{
	if($response != "" && isNumeric($response))
	{
		var string = '#favorBtn_'+$params.m_key+$params.i_key; 
		
		var button = $(string);
		var buttonLink = button.children('a');
		var buttonText = buttonLink.children('span');
		
		var newclick = new Function(String.format($link, $response));
		buttonLink.attr('onclick', '').click(newclick);
		buttonText.html($text);
		
		updateFavorBoxText($params.m_key,$params.i_key);
	}
}

/*
 * diese funktion aktualisiert die Anzeige an dem CommunityModule-Objekt
 */
function updateFavorBoxText($module_key , $index_key)
{
	
	if($('#favor_box_'+$module_key+$index_key) != null || $('#favor_box_'+$module_key+$index_key) != undefined)
	{
		SystemCall({method : 'getFavorBoxText', m_key: $module_key, i_key: $index_key }, null);
	}
}

function updateBoxTextCallback($text , $module_key , $index_key)
{
	$element = $('#favor_box_'+$module_key+$index_key);
	$element.animate({opacity : 0}, 200, function(){$element.html($text);}).animate({opacity : 1}, 400);
}

