// Umgebungsvariablen
var $ENV_iActListstart= 1; // akt. Start der Weinliste
var $ENV_iActListLen= 8; // akt. Laenge der Weinliste
var $ENV_sActView= 'kompakt';
var $ENV_sActBreite= 'start';
var $ENV_sActSortiment= 'gesamtsortiment';
var $ENV_oLastView= false; // letzte Optionen zum Rueckwaertsgehen
var $ENV_bNoTooltip= false; 
var $ENV_bTooltipOn= false; 
var $ENV_bVorkasse= false; // zum Vormerken von Vorkasse

var $aktHeadLayer= 0;
var $aktHeadPic= 1;
var $iInterval= 30; // Sek.
var $iWechseldauer= 3; // Sek.
var $rT1; // Timeout-Resource
var $iVersuche=0;
var $HIS_pos= 1;
$HIS_verlauf= new Array(); 

var $sZuJung= 'Sehr geehrte Kundin, sehr geehrter Kunde,\n\nwir weisen Sie darauf hin, dass wir gemäß unseren Allgemeinen\nGeschäftsbedingungen keinen Wein und keine Spirituosen an\nJugendliche unter 18 Jahren abgeben.\n';


function ist_datum($sDatum) {
	var $oDatum, $aDatum, $i1;
  $aDatum = $sDatum.split('-');
	for($i1=0; $i1<3; $i1++) {
		if(!isNaN(trim($aDatum[$i1]))) {
			$aDatum[$i1]= parseInt(parseFloat(trim($aDatum[$i1])));
		}
		else {
			return false;
		}
	}
	$oDatum= new Date( $aDatum[0], $aDatum[1]-1, $aDatum[2] );
	//alert(String($oDatum));
	if( ($aDatum[2]!=$oDatum.getDate()) || ($aDatum[1]!=($oDatum.getMonth()+1)) || ($aDatum[0]!=$oDatum.getFullYear()) ) {
		return false;
	}
	
	return true;
}


function alterFromDate($sGdatum, $s0datum) {
	var $alter, $i1;
	if($s0datum==null) {
		$o0datum= new Date();
		$a0datum= new Array();
		$a0datum[0]= $o0datum.getDate();
		$a0datum[1]= $o0datum.getMonth() + 1;
		$a0datum[2]= $o0datum.getFullYear();
		$s0datum= $a0datum.join('.');
	}
  $a0datum = $s0datum.split('.');
  $aGdatum = $sGdatum.split('.');
	for($i1=0; $i1<3; $i1++) { $a0datum[$i1]= $a0datum[$i1]*1; $aGdatum[$i1]= $aGdatum[$i1]*1; }
	//alert($aGdatum[0]+':'+$aGdatum[1]+':'+$aGdatum[2]);
  $alter = $a0datum[2] - $aGdatum[2];
	if(($a0datum[1]<$aGdatum[1]) || (($a0datum[1]==$aGdatum[1])&&($a0datum[0]<$aGdatum[0]))) { $alter--; }

  return $alter;
}



function uncheckAllOthers($oForm) { // Haekchen entfernen
	var $i1, $sZahlungshinweis;
	for($i1=0; $i1<document.forms.length; $i1++) {
		//alert(document.forms[$i1].name + ':' + $oForm.name);
		if(document.forms[$i1].name!=$oForm.name && document.forms[$i1].check) {
			document.forms[$i1].check.checked= false;
		}
	}
	// Zahlungshinweis ausgeben
	if(!$oForm.check.checked) {
		$sZahlungshinweis= 'BITTE WÄHLEN SIE IHRE ZAHLWEISE.';
	}
	else if($oForm.name=='chooseVK') {
		$sZahlungshinweis= 'Sie zahlen per Vorkasse und erhalten zusätzliche 5% Vorkasserabatt.';
	}
	else if($oForm.name=='chooseDD') {
		$sZahlungshinweis= 'Sie ermächtigen uns, den Betrag per Lastschrift von Ihrem Konto einzuziehen.';
	}
	else if($oForm.name=='chooseCC') {
		$sZahlungshinweis= 'Sie zahlen mit Ihrer Kreditkarte.';
	}
	document.getElementById("zahlungshinweis").childNodes[0].nodeValue= $sZahlungshinweis;
}
function getPaymentType() { // Zahlweise ermitteln lt. checkbox
	for(var $i1=0; $i1<document.forms.length; $i1++) {
		if(document.forms[$i1].check && document.forms[$i1].check.checked) {
			return 'form_' + document.forms[$i1].name;
		}
	}
	return false;
}
function submitNow($sFname) {
	if($sFname=='form_chooseVK') {
		updateContent({view:'warenkorb-bezahlung', form:document.forms[$sFname], step:'enter', paymenttype:'Vorkasse'}); 
	}
	else if($sFname=='form_chooseDD') {
		 updateContent({view:'warenkorb-bezahlung', form:document.forms[$sFname], step:'enter', paymenttype:'DirectDebit'}); 
	}
	else if($sFname=='form_chooseCC') {
		formOk=function($oForm) {
				var $i1, $iLeer, $iVoll, $oErstesLeeres;
				$iLeer=0; $iVoll=0;
				if($oForm.elements['re_aendern_kk']) {
					var $aFelder= new Array('rekkinhaber','rekknr','rekkexpiry_mon','rekkexpiry_jhr');
					for($i1=0; $i1<$aFelder.length; $i1++) {
						if($oForm.elements[$aFelder[$i1]].value=='') { if(0==$iLeer) $oErstesLeeres=$oForm.elements[$aFelder[$i1]]; $iLeer++; }
						else { $iVoll++; }
					}
				}
				var $aFelder= new Array('rekkvalnr');
				for($i1=0; $i1<$aFelder.length; $i1++) {
					if($oForm.elements[$aFelder[$i1]].value=='') { if(0==$iLeer) $oErstesLeeres=$oForm.elements[$aFelder[$i1]]; $iLeer++; }
					else { $iVoll++; }
				}
				if($iLeer!=0) {
					alert('Kreditkartendaten\n\nBitte füllen Sie die Felder zur Kreditkarte komplett aus!\n\n');
					$oErstesLeeres.focus();
					return false;
				}
			return true;
		};
		if(formOk(document.forms[$sFname])) {
			updateContent({view:'warenkorb-bezahlung', form:document.forms[$sFname], step:'enter', paymenttype:'CreditCard'});
		}
	} // wenn CC
}


var my_tooltip;
var $iAktUid= 0;
function showTooltipNow($sId) { // Tooltip initialisieren
		my_tooltip = new Tooltip($sId, 'wein-tooltip');
		//$ENV_bNoTooltip=false;
		//var my_tooltip= new Tip('wein-thumb-<?php echo $iUid; ?>', 'content',
		//  {  
		//    //className: 'tooltip',  // or your own class
		//    closeButton: false,     // or true
		//    duration: 0.3,         // duration of the effect, if used
		//    delay: 0.2,            // seconds before tooltip appears
		//    effect: false,         // false, 'appear' or 'blind'
		//    fixed: false,          // follow the mouse if false
		//    hideOn: 'mouseout',     // 'click', 'mousemove', 'mouseover',
		//                       //       { element: 'element|target|tip|closeButton|.close',
		//                         //       event: 'click|mouseover|mousemove' },
		//    //hook: false,           // { element: 'topLeft|topRight|bottomLeft|bottomRight|
		//                                  //topMiddle|bottomMiddle|leftMiddle|rightMiddle',
		//                                //tip: 'topLeft|topRight|bottomLeft|bottomRight|
		//                             //         topMiddle|bottomMiddle|leftMiddle|rightMiddle' }
		//    offset: {x:16, y:16},   // or your own, example: {x:30, y:200}
		//    showOn: 'mousemove',   // or 'click', 'mouseover', 'mouseout'                              
		//    //target: 'anotherId',   // make the tooltip appear on another element
		//    title: false,          // or a string, example: 'tip title'
		//    viewport: true         // keep within viewport, false when fixed or hooked
		//  }
		//);
}
function showTooltip($iUid, $sIdPraefix) { // Tooltip aktualisieren
		// Tooltip-Inhalt
		$ENV_bNoTooltip=false; // window.status=$ENV_bNoTooltip;
		if(true || $iAktUid!=$iUid) {
			new Ajax.Updater('wein-tooltip', '/lib/tmpl.flyout.php', {onComplete:function(){  }, asynchronous:true, evalScripts:true, method:'post', parameters:'uid='+$iUid});
			$iAktUid=$iUid;
		}
} // showTooltip
function showTooltipJetzt() { // Tooltip einblenden
	if(!$ENV_bNoTooltip) {
		new Effect.Appear('wein-tooltip', {duration:0.5});
	}
}
function hideTooltip() { // Tooltip ausblenden
	$ENV_bNoTooltip=true; // window.status=$ENV_bNoTooltip;
	$('wein-tooltip').hide();
	//Element.setStyle('wein-tooltip', {visibility:'hidden'});
}


function chImgSrc() {
	$iVersuche++;
	if($iVersuche<3) {
		document.images['head-pic-'+$aktHeadLayer].src= '/bilder/layout/headpix/VIN_head-'+$aktHeadPic+'.jpg';
	}
	else {
		clearTimeout($rT1);
		$iVersuche=0;
		setTimeout('chImgSrc();', 5*$iInterval*1000);
		$rT1= setTimeout('fadeNextHead();', 6*$iInterval*1000);
	}
}
function fadeNextHead() {
	$iVersuche=0;
	//alert($aktHeadLayer);
	Effect.Appear('head-layer-'+$aktHeadLayer, {duration: $iWechseldauer});	
	$aktHeadLayer= 1 - $aktHeadLayer;
	Effect.Fade('head-layer-'+$aktHeadLayer, {to:0, duration: $iWechseldauer});
	$aktHeadPic++;
	setTimeout('chImgSrc();', $iWechseldauer*2000);
	$rT1= setTimeout('fadeNextHead();', $iInterval*1000);
}





function BD() {
	this.select= cSelect;

}

function BDselect($sElm, $sAction, $aListe, $oParams) {
	this.e= document.getElementById($sElm);
	this.e.aListe= $aListe;
	this.e.sAction= $sAction;
	this.e.oP= $oParams;
	this.e.aOldVals= new Array();
	this.e.bSelectOn= false;
	this.e.bSelectOpen= false;
	this.e.changeOpenState= mChangeOpenState;
	this.e.onmouseover= mShowSelect;
	this.e.hideSelect= mHideSelect;
	this.e.updateContent= mUpdateContent;
	//updateContent({view:$ENV_sActView, sortiment:$ENV_sActSortiment});
}

function mShowSelect() {
	if(!this.bSelectOn) {
		var $i1, iKey;
		var $oForm, $oSelect, $oOption, $sVergleichsText='';
		while( this.hasChildNodes() ) {
			this.aOldVals[this.aOldVals.length]= this.lastChild;
			this.removeChild(this.lastChild);
		}
		for($i1=this.aOldVals.length-1; $i1>=0; $i1--) {
				$sVergleichsText+= trim(this.aOldVals[$i1].data);
		}
		//alert($sVergleichsText);
		$oForm= document.createElement('form');
		$oForm.setAttribute('className', 'filter-form');
		$oForm.setAttribute('class', 'filter-form');
		$oSelect= document.createElement('select');
		$oSelect.setAttribute('id', 'auswahl');
		$oSelect.setAttribute('name', 'auswahl');
		$oSelect.setAttribute('className', 'filter-select');
		$oSelect.setAttribute('class', 'filter-select');
		$oSelect.onchange= this.updateContent; //function() { alert('hallo2'); }
		$oSelect.onmouseout= this.hideSelect;
		//$oSelect.onblur= this.hideSelect;
		$oSelect.onclick= this.changeOpenState;
		for($iKey in this.aListe) {
			if(parseInt($iKey)==$iKey || $iKey=='ohnefilter') {
				$oOption= document.createElement('option');
				$oOption.setAttribute('value', (($iKey=='ohnefilter')?0:$iKey));
				if($sVergleichsText==this.aListe[$iKey]) {
					$oOption.setAttribute('selected', 'selected');
				}
				$oOption.appendChild(document.createTextNode(this.aListe[$iKey]));
				$oSelect.appendChild($oOption);
			}
		}
		$oForm.appendChild($oSelect);
		this.appendChild($oForm);
		this.bSelectOn= true;
	}
} // mShowSelect

function mHideSelect() {
	var $oP= this.parentNode;
	var $oPP= $oP.parentNode;
	if($oPP.bSelectOn && !$oPP.bSelectOpen) {
		$oPP.bSelectOn= false;
		var $i1;
		while( $oPP.hasChildNodes() ) {
			$oPP.removeChild($oPP.lastChild);
		}
		for($i1=$oPP.aOldVals.length-1; $i1>=0; $i1--) {
			//alert($oPP.aOldVals[$i1].data);
			$oPP.appendChild($oPP.aOldVals[$i1]);
		}
		$oPP.aOldVals=new Array();
	}
}

function mUpdateContent() {
	var $oP= this.parentNode;
	var $oPP= $oP.parentNode;
	if($oPP.bSelectOn) {
		$oPP.bSelectOn= false;
		new Ajax.Updater($oPP, $oPP.sAction, {
			onComplete:function(){ 
				updateContent({view:$ENV_sActView, sortiment:$ENV_sActSortiment});
				//new BDselect($oPP.id, $oPP.sAction, $oPP.aListe, $oPP.oP); 
			},
			asynchronous:true,
			evalScripts:true,
			method:'post',
			parameters:'wert='+this.value+'&ftype='+$oPP.oP.ftype
		});
		$oPP.aOldVals=new Array();
	}
}

function mChangeOpenState() {
	var $oP= this.parentNode;
	var $oPP= $oP.parentNode;
	$oPP.bSelectOpen= ($oPP.bSelectOpen)?false:true;
}



function serializeForm($oForm) {
	var $i1; var $sKeys='';
	var $sSer= ''; var $aSer= new Array();
	var $aElms= $oForm.elements;
	for($i1=0; $i1<$aElms.length; $i1++) {
		if($aElms[$i1].name!='') { 
			if(('checkbox,radio'.indexOf($aElms[$i1].type)>=0 && $aElms[$i1].checked) || ('text,textarea,hidden'.indexOf($aElms[$i1].type)>=0 && $aElms[$i1].value!='')) {
				$aSer[$aSer.length]= encodeURIComponent($aElms[$i1].name) + '=' + encodeURIComponent($aElms[$i1].value);
			}
			else if('select-one,select-multiple'.indexOf($aElms[$i1].type)>=0) {
				$aOpts= $aElms[$i1].options;
				for($i2=0; $i2<$aOpts.length; $i2++) {
					if($aOpts[$i2].selected==true) {
						if($aOpts[$i2].value!='') {
							$aSer[$aSer.length]= encodeURIComponent($aElms[$i1].name) + '=' + encodeURIComponent($aOpts[$i2].value);
						}
						else { // falls value leer oder nicht vorhanden
							$aSer[$aSer.length]= encodeURIComponent($aElms[$i1].name) + '=' + encodeURIComponent($aOpts[$i2].text);
						}
					} // option ist selected
				}
			} // Listen
		}
	}
	$sSer= $aSer.join('&');
	return $sSer;
} // function serializeForm


function updateMenus() {
	// Sortiment-Box
	new Ajax.Updater('sortiment-content', '/lib/mod.sortiment.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
	// Filter-Box
	new Ajax.Updater('filter-content', '/lib/mod.filter.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
	// Breadcrumbs-Box
	new Ajax.Updater('breadcrumbs', '/lib/mod.breadcrumbs.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
	// Viewchange-Box
	new Ajax.Updater('viewchange', '/lib/mod.viewchange.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
	// Login-Link
	new Ajax.Updater('loginlink', '/lib/mod.loginlink.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
}


function saveHistory() {
	if($bHistorySaveOnly) {
		// historyFrame aktualisieren
		var $oT= new Date();
		self.historyFrame.location.href= '/lib/inc.history.php?pos=' + ($HIS_pos++) + '&timestamp=' + $oT.getTime();
	}
}


$bHistorySaveOnly= false;
function updateContent($oOpt) {
	// verhindern, dass die inc.history.php den Content-Bereich aendert
	$bHistorySaveOnly= true;

	// Content-Bereich aktualisieren
	updateContentDirect($oOpt);
}
function updateContentDirect($oOpt) {
	hideTooltip();

	if($oOpt) {
		var $aJsParams= new Array();
		var $bScrollToTop=true;
		var $sOptKey;
		if(!$oOpt['sfilter']) { $oOpt['sfilter']= ''; }

		for($sOptKey in $oOpt) {
			//if($sOptKey=='sfilter') { alert($oOpt[$sOptKey]); }
			if($sOptKey=='start') { $ENV_iActListstart= $oOpt[$sOptKey]; } // akt. Start der Weinliste
			if($sOptKey=='sortiment') { $ENV_sActSortiment= $oOpt[$sOptKey]; } // akt. gewaehltes Sortiment
			if($sOptKey=='position' && $oOpt[$sOptKey]=='_stay') { $bScrollToTop=false; }
			if($sOptKey=='position' && $oOpt[$sOptKey]=='_top') { $bScrollToTop=true; }
			if($sOptKey=='ftype' && $oOpt[$sOptKey]=='deleteallfilters') {  if(self.document.volltextform.wert) { self.document.volltextform.wert.value=self.document.volltextform.wert.defaultValue; } }
			
			if($sOptKey=='view') {
				if('#,bilder,liste,kompakt,detail,impressum,agb,versand,uebervin,login,#'.indexOf(','+$oOpt[$sOptKey]+',')>-1) {
					fadeOutWk();
				}
				else if($oOpt[$sOptKey].indexOf('warenkorb-bestaetigung')==0 && parseInt($oOpt['addressonly'])==1) {
					fadeOutWk();
				}
				else if($oOpt[$sOptKey].indexOf('warenkorb-')==0) {
					fadeInWk();
				}
			} // akt. gewaehltes Sortiment

			// Felder zum Gesamten Var.-Stamm hinzu
			if($sOptKey=='form') { // Felder aus einem Formular
				$aJsParams.push(serializeForm($oOpt[$sOptKey]));
			}
			else if($sOptKey=='HISfilter') { // wenn Uebergabe durch inc.history als Object
				for($sFTypes in $oOpt[$sOptKey]) {
					$aJsParams.push(encodeURIComponent($sOptKey) + '[' + $sFTypes + ']=' + encodeURIComponent($oOpt[$sOptKey][$sFTypes]));
				}
			}
			else { // uebergebener Eintrag
				$aJsParams.push(encodeURIComponent($sOptKey) + '=' + encodeURIComponent($oOpt[$sOptKey]));
			}
		}
		$sJsParams= $aJsParams.join('&');

		// Content-Bereich verstecken
		//$('content-re').hide();
		Element.setStyle('content-re', {visibility:'hidden'});
		if($bScrollToTop) {
			window.scrollTo(0, 0);
		}
		
		// Hauptcontent rechts
		new Ajax.Updater('content-re-box', '/lib/inc.content.php', {onComplete:function(){ saveHistory(); updateMenus(); Element.setStyle('content-re', {visibility:'visible'}); Element.setStyle('deckweiss', {visibility:'hidden'}); },asynchronous:true, evalScripts:true, method:'post', parameters:$sJsParams});
	
	} // wenn $oOpt uebergeben
	
} // function updateContent


function updateWk() {
	new Ajax.Updater('warenkorb-content', '/lib/mod.warenkorb.php', {onComplete:function(){/* */},asynchronous:true, evalScripts:true, method:'post'});
} // function updateWk

function updateLoginBox($sUserUid) {
	if($sUserUid=='' || $sUserUid=='0') {
		$sDisplayType= 'none';
	}
	else {
		$sDisplayType= 'block';
	}
	
	new Ajax.Updater('meine-vin', '/lib/mod.meine-vin.php', {onComplete:function(){$('meine-vin').style.display=$sDisplayType; }, asynchronous:true, evalScripts:true, method:'post'});

}

function fadeInWk () {
	if($ENV_sActBreite!='breit') {
		Element.setStyle('content-mi', {visibility:'hidden'});
		new Effect.Move ($('content-re'),{ x:-205, y:0, mode: 'relative', duration:0.1}); 
		new Effect.Scale('content-re', 140.15, {scaleContent:false, duration:0.1});
		$ENV_sActBreite= 'breit';
	}
}
function fadeOutWk () {
	if($ENV_sActBreite=='breit') {
		Element.setStyle('content-mi', {visibility:'visible'});
		//$('content-mi').show();
		new Effect.Move ($('content-re'),{ x:410, y:0, mode: 'absolute', duration:0.1});
		new Effect.Scale('content-re', 71.3, {scaleContent:false, scaleMode:{ originalHeight:400, originalWidth:715 }, duration:0.1});
		$ENV_sActBreite= 'schmal';
	}
}
function fadeOutStart () {
	if($ENV_sActBreite=='start') {
		new Effect.Move ($('content-re'),{ x:410, y:0, mode: 'absolute', duration:0.1});
		new Effect.Scale('content-re', 71.3, {scaleContent:false, scaleMode:{ originalHeight:400, originalWidth:715 }, duration:0.1});
		$ENV_sActBreite= 'schmal';
	}
}




/**
*
* belasse nur gewuenschte Zeichen
*
**/
function leaveChars(str, chars) {
  return str.replace(new RegExp("[^" + chars + "]+", "g"), "");
}

function isEmail($sEmail) {
	if($sEmail.match(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\.)+([a-zA-Z]{2,6})$/)) {
		return true;
	}
	else	{
		return false;
	}
} // function isEmail
/**
*
* Javascript trim, ltrim, rtrim
* http://www.webtoolkit.info/
*
*
**/
function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

var md5 = function (string) {
/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

	function RotateLeft(lValue, iShiftBits) {
		return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
	}

	function AddUnsigned(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);
		}
 	}

 	function F(x,y,z) { return (x & y) | ((~x) & z); }
 	function G(x,y,z) { return (x & z) | (y & (~z)); }
 	function H(x,y,z) { return (x ^ y ^ z); }
	function I(x,y,z) { return (y ^ (x | (~z))); }

	function FF(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function GG(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function HH(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function II(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function ConvertToWordArray(string) {
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=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] | (string.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;
	};

	function WordToHex(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;
	};

	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	};

	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;

	string = Utf8Encode(string);

	x = ConvertToWordArray(string);

	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

	for (k=0;k<x.length;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();
}


