// JavaScript Document
// var menuinprogress=false;

function shuffle(o){ //v1.0
	for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
	return o;
};

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"), "");
}

function ajaxError(mes,donotreload) {
		if (!donotreload) {
			mes += "\nPage will be reloaded";
			alert(mes);
			document.location.reload();
			}
		else {
			if (mes) alert(mes);
			}
		}

var basketHighlighted = new Array();
var oldtotalsum = 0;

function grayInput(el,fb) {
	if (fb) {
		if (el.hasClassName('grayinput')) {
			el.value='';
			el.removeClassName('grayinput');
			}
		}
	else {
		if (el.value=='')  {
			el.addClassName('grayinput');
			el.value = el.readAttribute('graytext');
			}
		}
	
	}

function finishOrder() {
		if (!$('customer_phone').value.match(/([\d]([^\d])?){5,}/) || $('customer_phone').hasClassName('grayinput')) {
				new Effect.Highlight('customer_phone',{
						duration: 0.3,
						startcolor: '#ffffff',
						endcolor: '#ff0000',
						queue: { position: 'end', scope: 'basket_small_phone' }
						});
				new Effect.Highlight('phonemessage',{
						startcolor: '#f28e18',
						endcolor: '#ff0000',
						duration: 0.3,
						queue: { position: 'end', scope: 'basket_small_phone' }
						});
				}
			else {
					$('finifshorderform').submit();
					}
		}

function updateBasket(transport) {
//	alert(transport.responseText);
//	_d(transport,true);
								var items = transport.responseText.split("\n");
								var i;
								var basketitem = new Array();
								var basketitem_id_by_num = new Array();
								var basketitem_num_by_id = new Array();
								var totalsum = 0;
								for (i=0; i<items.length-1; i++) {
										var tmp = trim(items[i]);
										if (tmp.match(/^[\d]+:.*/)) {
												var id = parseInt(tmp.replace(/^([\d]+):.*/,'$1'));
												basketitem_num_by_id[id] = basketitem_id_by_num.length;
												basketitem_id_by_num.push(id);
												totalsum += parseFloat(tmp.replace(/.*:discounted([\d]+(\.[\d]*)?).*/,'$1'));
												basketitem[id] = {'price': parseFloat(tmp.replace(/.*:price([\d]+(\.[\d]*)?).*/,'$1')),
																					'id': id,
																					'count': parseInt(tmp.replace(/.*:count([\d]+(\.[\d]*)?).*/,'$1')),
																					'sum': parseFloat(tmp.replace(/.*:sum([\d]+(\.[\d]*)?).*/,'$1')),
																					'discounted': parseFloat(tmp.replace(/.*:discounted([\d]+(\.[\d]*)?).*/,'$1'))};
												}
										else 
											{
											if ( (tmp=='') ) {
											}
											else {
												return ajaxError('Server communication error. Response: ' + transport.responseText);
												}
											}
									}
								var uah = Math.floor(totalsum);
								var cop = Math.round(totalsum*100 - uah*100);
								if (cop == 100) {
										uah++;
										cop = 0;
										}
								$('basket_sum').innerHTML = '' + uah + ',' + cop;
								if (totalsum && !oldtotalsum) {
									new Effect.SlideUp($('noorder'), {
														duration: 0.3,
														queue: { position: 'end', scope: 'basket_small' }
														});
									new Effect.SlideDown($('isorder'), {
														duration: 0.6,
	 													queue: { position: 'end', scope: 'basket_small' }
														});
//									$('noorder').hide();
	//								$('isorder').show();
									// $('isorder1').show();
									}
								else if (!totalsum && oldtotalsum) {
									new Effect.SlideUp($('isorder'), {
														duration: 0.6,
														queue: { position: 'end', scope: 'basket_small' }
														});
									new Effect.SlideDown($('noorder'), {
														duration: 0.3,
	 													queue: { position: 'end', scope: 'basket_small' }
														});
//									$('isorder').hide();
									// $('isorder1').hide();
//									$('noorder').show();
//									new Effect.SlideUp($('isorder'), {duration: 1.3});
//									new Effect.SlideDown($('noorder'), {duration: 1.3});
									}
								oldtotalsum = totalsum;
								var idish;
								for (i=0; i<basketitem_id_by_num.length; i++) 
													if ( !$('basket_item_' + basketitem_id_by_num[i]) && 
															(idish = dish[dish_num_by_id[basketitem_id_by_num[i]]]) ) {
										var toinsert = $('basket_item_template').innerHTML;
										toinsert = toinsert.replace(/#id#/g, basketitem_id_by_num[i]).replace(/\/file\//g,idish.small).replace(/#price#/g,idish.price).replace(/#description#/g,idish.description).replace(/#weight#/g,idish.weight);
										if (!idish.price) toinsert = toinsert.replace(/class=..priceperportion../,'class=\\\'priceperportion\\\' style=\\\'display: none;\\\'');
										if (idish.weight=='') toinsert = toinsert.replace(/class=..weight../,'class=\\\'weight\\\' style=\\\'display: none;\\\'');
										insertItem('<div id="basket_item_'+ basketitem[basketitem_id_by_num[i]].id +'" class="basket_item">'+ toinsert + '</div>');
										}
								$('basket_items').select('.basket_item').each(function (el) {
									var tmpid = parseInt(el.id.replace(/basket_item_/,''));
									var tmpitem = basketitem[tmpid];
									var elementGhosted = isGhosted(el);
									if (!tmpitem && !elementGhosted) ghostItem(el);
									if (tmpitem && elementGhosted) unghostItem(el,tmpitem);
									if (tmpitem && !elementGhosted) updateItem(el,tmpitem);
									});
								}

function updateItem (el,newdata,forcehighlight) {
		var tmpid = el.id.replace(/basket_item_/,'');
		tmpid = parseInt(tmpid);
		if (dish_num_by_id[tmpid]===undefined) {
			return
			};
		var updish = dish[dish_num_by_id[tmpid]];
		var oldcontent = el.innerHTML;
		el.down('div.basket_small_name').innerHTML = updish.title;
		el.down('input.basket_small_count').value = newdata.count;
		el.down('div.basket_small_count').innerHTML = newdata.count;
		if ($('big_basket_items['+ tmpid +']')) $('big_basket_items['+ tmpid +']').value = newdata.count;
		el.down('div.basket_small_discounted').innerHTML = Math.floor(newdata.discounted) + ',' + 
				(Math.round(((newdata.discounted-Math.floor(newdata.discounted)))*100)?Math.round(((newdata.discounted-Math.floor(newdata.discounted)))*100):'00');
		var newcontent = el.innerHTML;
		if ( ((newcontent != oldcontent) || forcehighlight )  && (!basketHighlighted[tmpid]) ) {
			basketHighlighted[tmpid] = true;
			new Effect.Highlight(el.down('.basket_small_item_table'),{
						duration: 0.2,
						startcolor: '#bcca32',
						endcolor: '#ffdd92',
						afterFinish: function() {
								basketHighlighted[tmpid] = false;
								},
						queue: { position: 'end', scope: 'basket_small' }
						});
			}
}


function ghostItem(el) {
		var tmpid = el.id.replace(/basket_item_/,'');
		tmpid = parseInt(tmpid);
		el.down('div.basket_small_name').innerHTML = dish[dish_num_by_id[tmpid]].title;
		el.down('input.basket_small_count').value = '0';
		el.down('div.basket_small_count').innerHTML = '0';
		if ($('big_basket_items['+ tmpid +']')) $('big_basket_items['+ tmpid +']').value = '0';
		el.down('div.basket_small_discounted').innerHTML = '0';
		var nextItem = el.nextSiblings()[0];
		if ( !nextItem || isGhosted(nextItem)) {
				new Effect.Opacity(el, {duration: 0.3, from: 1.0, to: 0.3});
				}
		else {
			new Effect.Parallel([
				  							new Effect.Opacity(el, {duration: 0.3, from: 1.0, to: 0.0}),
												new Effect.SlideUp(el, {duration: 0.3})], 
												{ 
  											duration: 0.3,
												afterFinish: function() {
																var copyel = '<div style="display: none;" id="basket_item_'+tmpid+'" class="basket_item">' + el.innerHTML + '</div>';
																el.remove();
																insertItem(copyel.replace(/value="[^"]*"/,'value="0"'));
																$('basket_item_' + tmpid).setOpacity(0.3);
																new Effect.SlideDown('basket_item_' + tmpid, {duration: 0.3});
																}, 
																queue: { position: 'end', scope: 'basket_small' }
														});
			}
	}
	
function unghostItem(el,newdata) {
		var tmpid = el.id.replace(/basket_item_/,'');
		tmpid = parseInt(tmpid);
		var ptevItem = el.previousSiblings()[0];
		if ( !ptevItem || !isGhosted(ptevItem)) {
				new Effect.Opacity(el, {duration: 0.3, from: 0.3, to: 1.0, 
								   queue: { position: 'end', scope: 'basket_small' }
								   });
				updateItem(el,newdata,true);
				}
		else {
				new Effect.SlideUp(el, {duration: 0.3,
																afterFinish: function() {
																		var copyel = '<div style="display: none;" id="basket_item_'+tmpid+'" class="basket_item">' + el.innerHTML + '</div>';
																el.remove();
																insertItem(copyel.replace(/value="[^"]*"/,'value="'+ newdata.count +'"'));
																new Effect.SlideDown('basket_item_' + tmpid, {duration: 0.3, afterFinish: function() {updateItem($('basket_item_' + tmpid),newdata,true)} });
																}, 
																queue: { position: 'end', scope: 'basket_small' }
														});
			}
	}
	
function isGhosted(el) {
		var inp;
		return (el && (inp = el.down('input.basket_small_count')) && (inp.value=='0') );
		}

function insertItem(toinsert) {
		var insbm = $('basket_items').select('.basket_item').find(isGhosted);
		if (insbm) insbm.insert({before: toinsert});
		else $('basket_items').insert({bottom: toinsert});
		}

function orderChange(ael,ch) {
		if ($(ael)) {
			var inpel = Element.down($(ael).parentNode.parentNode.parentNode,'input');
			var orderid = inpel.id.replace(/.*basket_items\[([\d]+)\]/,'$1');
		}
		else {
			var inpel = '';
			var orderid = '';
			}
//		_d('/a_order.html?rand='+Math.random()+'&basket_id='+orderid + '&basket_num=' + ch,true);
		new Ajax.Request('/a_order.html?rand='+Math.random()+'&basket_id='+orderid + '&basket_num=' + ch ,{
					method: 'post',
					onSuccess: updateBasket
					});
	
		return false;
		}

function orderNow(id) {
		new Ajax.Request('/a_order.html?rand='+Math.random()+'&basket_id='+id + '&basket_num=1' ,{
						method: 'post',
						onSuccess: updateBasket
						});
		}


function submenu(suffix)
{
	$('menu_td').select('div.submenu_div').each(function(el) {
			if (!(el.id==('submenu_div_'+suffix)) && el.visible()) Effect.SlideUp(el, { duration: 0.3 });
			});
	Effect.toggle('submenu_div_' + suffix, 'slide', { duration: 0.3 });
//	Effect.toggle('submenustretch_div', 'slide', { duration: 0.3 });
	return false;
	menuinprogress = true;
	if ($('submenu_div_' + suffix).visible()){
		Effect.BlindUp('submenu_div_'); 
		return false;
		}
	else {
		Effect.BlindDown('submenu_div'); 
		return false;
		}
}


function dim() {
	}
	
	
function setErrorMessages(formid,setnotices,setwarnings,seterrors) {

	if (!seterrors) seterrors = $H({});
	if (!setwarnings) setwarnings = $H({});
	if (!setnotices) setnotices = $H({});
	var retval;
	var formisok = true;
	$(formid).select('.error').each( function (idiv) {
		if (retval = seterrors.get(idiv.id.replace(/^(.*)_error$/,"$1"))) {
			idiv.innerHTML = retval;
			idiv.show();
			formisok = false;
				}
		else {
			idiv.innerHTML = '';
			idiv.hide();
			}
		});
	$(formid).select('.warning').each( function (idiv) {
		if (retval = setwarnings.get(idiv.id.replace(/^(.*)_warning$/,"$1"))) {
			idiv.innerHTML = retval;
			idiv.show();
			}
		else {
			idiv.innerHTML = '';
			idiv.hide();
			}
		});

	$(formid).select('.notice').each( function (idiv) {
		if (retval = setnotices.get(idiv.id.replace(/^(.*)_notice$/,"$1"))) {
			idiv.innerHTML = retval;
			idiv.show();
			}
		else {
			idiv.innerHTML = '';
			idiv.hide();
			}
		});
	
	$(formid).getInputs('submit').each( function (submb) {
		submb.disabled = !formisok;
		} );
	
	return formisok;
	}

function decodeAjaxAnswer(mes) {
	var mesa = mes.split("\n");
	var res = new Hash();
	res.set('error',new Hash());
	res.set('warning',new Hash());
	res.set('notice',new Hash());
	var message;
	mesa.each(function(line) {
		if (message = line.match(/\s*(error|warning|notice)\s*:([^\s]+)\s*:\s*(.*)\s*$/)) {
			res.get(message[1]).set(message[2],message[3]);
			}
		})
	return res;
	}


function checkForm(formid,ajaxurl,trytopost) {


	if (!trytopost) {
		var reterrors = false;
		var retwarnings = false;
		var retnotices = false;
		if ($(formid).formchecking) return;
		$(formid).formchecking = $H($(formid).serialize(true));
		if ($(formid).formchecking.toJSON() == $(formid).formchecked ) {
			$(formid).formchecking = false;
			return false;
			}
		}
	else {
		$(formid).getInputs('submit').each( function (submb) {
			submb.disabled = true;
			});
		$(formid).formchecking = $H($(formid).serialize(true));
		dim(formid,true,'<h2>Saving data...</h2>');
		}
	
	new Ajax.Request(ajaxurl + '?ajax=1' + (trytopost?'&editstage=post':'') , {
  	method: 'POST', 
  	parameters: $(formid).formchecking,
	onSuccess: function(transport) {
		$(formid).formchecked = $(formid).formchecking.toJSON();
		var tmp = decodeAjaxAnswer(transport.responseText);
		reterrors = tmp.get('error');
		retwarnings = tmp.get('warning');
		retnotices = tmp.get('notice');
		dim(formid,false);
		setErrorMessages(formid,retnotices,retwarnings,reterrors);
		$(formid).formchecking =false;
		if (trytopost && $(formid).ajaxOptions.onSuccess) $(formid).ajaxOptions.onSuccess(resp);
		},
	onFailure:function() {
		setErrorMessages(formid,false);
		$(formid).formchecking = false;
		$(formid).formchecked = false;
		dim(formid,false);
		},
	onException: function() {
		setErrorMessages(formid,false);
		$(formid).formchecking = false;
		$(formid).formchecked = false;
		dim(formid,false);
		}
	});
	return false;
}

function ajaxCheckForm(formid,ajaxurl,opt){
	
	$(formid).getInputs('submit').each(function(el) {el.disabled=true;});
	$(formid).formchecking = false;
	$(formid).formchecked = false;

	
	var opts = Object.extend({
			timeinterval: 250,
			onSuccess: null
							}, arguments[2] || { });
	$(formid).ajaxOptions = opts;
	setInterval("checkForm('"+formid+"','"+ajaxurl+"',false)",opts.timeinterval);
	if (!$(formid).onsubmit) $(formid).onsubmit = function (event) {
		checkForm(formid, ajaxurl, true); 
		return false;
		};
	}
	

document.write('<div style="position: absolute; right: 0px; width: 200px; height: 300px; overflow: auto;" id="_d"></div>');

function _d(o,a,c) {
	if (a)
		$('_d').innerHTML =  (c?Object.toJSON(o):o) + ((o && o.id)?(' id=' + o.id):'') + '<br>' + $('_d').innerHTML;
	else
		$('_d').innerHTML = Math.random() + ': ' + (c?Object.toJSON(o):o) + ((o && o.id)?(' id=' + o.id):'');
	return true;
	}
	
function utf8_encode ( argString ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    var string = (argString+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
 
    var utftext = "";
    var start, end;
    var stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }
 
    if (end > start) {
        utftext += string.substring(start, string.length);
    }
 
    return utftext;
}
	
function md5 ( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // + namespaced by: Michael White (http://getsprink.com)
    // +    tweaked by: Jack
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_encode
    // *     example 1: md5('Kevin van Zonneveld');
    // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'
 
    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();
}