$.fn.replaceWithAndReturnNew = function(html){
   var div = document.createElement('div');
   var replaced = this[0];
   replaced.parentNode.replaceChild(div, replaced);
   div.innerHTML = html;
   var replacer = div.firstChild;
   div.parentNode.replaceChild(replacer, div);
   return $(replacer);
};

// Need this workaround because aspectRatio for resizable cannot
// be set after the resizable is initiated
var FLUIDIMAGECACHE = [];
(function() {
   // Work around http://dev.jqueryui.com/ticket/4186
   var oldSetData = $.ui.resizable.prototype._setData;
   $.ui.resizable.prototype._setData = function(key, value) {
      oldSetData.apply(this, arguments);
      if (key === "aspectRatio") {
         this._aspectRatio = !!value;
      }
   };

   // Fix for nested draggables
   // http://dev.jqueryui.com/ticket/4333
   $.extend($.ui.draggable.prototype, (function (orig) {
     return {
       _mouseCapture: function (event) {
         var result = orig.call(this, event);
         if (result && $.browser.msie) event.stopPropagation();
         return result;
       }
     };
   })($.ui.draggable.prototype["_mouseCapture"]));

   $.extend($.fn.disableTextSelect = function() {
      return this.each(function(){
         if($.browser.mozilla){//Firefox
            $(this).css('MozUserSelect','none');
         }else if($.browser.msie){//IE
            $(this).bind('selectstart',function(){return false;});
         }else{//Opera, etc.
            $(this).mousedown(function(){return false;});
         }
      });
   });

   $.preLoadImages = function() {
      var args_len = arguments.length;
      for (var i = args_len; i--;) {
         var cacheImage = document.createElement('img');
         cacheImage.src = arguments[i];
         FLUIDIMAGECACHE.push(cacheImage);
      }
   }

})();


// Global variables
var CARTQUANTITIES = [];

var FLUID = {
   jQuery : $,

   settings : {
   },

   init : function () {
      this.initializeLayout();
      this.initializeCart();
   },

   initializeLayout : function() {
      var FLUID = this,
         $ = this.jQuery;

      $('.featureImageDot').unbind().mouseenter(function() {
         if ($('#' + this.id + ' img').attr('src').indexOf("dotred") >= 0)
            return;

         $(this).css('cursor', 'pointer');
         $('#' + this.id + ' img').attr('src', "/images/dotwhite.gif");
      }).mouseleave(function() {
         if ($('#' + this.id + ' img').attr('src').indexOf("dotred") < 0)
            $('#' + this.id + ' img').attr('src', "/images/dotgray.gif");

         $(this).css('cursor', '');
      }).click(function() {
         var id = this.id.replace(/featureImageDot/,'');

         if (id == FEATUREIMAGECURRENT)
            return;

         FEATUREIMAGEMANUALSELECT = true;
         featureImagesLoad(id);
         return false;
      });

      $('.featureImage').unbind().mouseenter(function() {
         $(this).css('cursor', 'pointer');
      }).mouseleave(function() {
      }).click(function() {
         FEATUREIMAGEMANUALSELECT = true;
         next = FEATUREIMAGECURRENT + 1;

         if (next > FEATUREIMAGES)
            next = 1;

         featureImagesLoad(next);
         return false;
      });



      // Initialize the feature images
      var featureImages = $('.featureImage').size();
      if (featureImages > 0)
         initializeFeatureImages(featureImages);

      // Products
/*
      $('.productShort').unbind().mouseenter(function() {
         $(this).css('cursor', 'pointer');
         $('.productShortCaptionBG', $(this)).css('background-color', '#808080');
      }).mouseleave(function() {
         $('.productShortCaptionBG', $(this)).css('background-color', '#000000');
      }).click(function() {
         var id = this.id.split("_");
         var productid = id[1];
         location.href = "/product/" + productid + "/";
      });
*/
      // Product type toggle
      $('.productInventoryTypeOff').unbind().mouseenter(function() {
         $(this).css('border-top','1px dashed #888888');
         $(this).css('border-left','1px dashed #888888');
         $(this).css('border-right','1px dashed #888888');
         $(this).css('cursor','pointer');
      }).mouseleave(function() {
         $(this).css('border-top','1px dashed #cccccc');
         $(this).css('border-left','1px dashed #cccccc');
         $(this).css('border-right','1px dashed #cccccc');
      }).click(function() {
         var type = this.id;

         // Hide all type blocks
         $('.productInventoryTypeBlock').hide();

         // Now set the type to off that is on
         $('.productInventoryTypeOn').removeClass('productInventoryTypeOn').addClass('productInventoryTypeOff').unbind();

         // Now set this to have the On class
         $(this).removeClass('productInventoryTypeOff').addClass('productInventoryTypeOn').unbind().css('border','').css('cursor','');

         // Now display the type block
         $('#producttype_' + type).show();

         FLUID.initializeLayout();

         return false;
      });

      $('.orderHistoryRow,.userRow').unbind().mouseenter(function() {
         $(this).css('background-color', '#eeeeee');
      }).mouseleave(function() {
         $(this).css('background-color', '');
      });

      // THumbnails
      $('.productLongThumb').unbind().mouseenter(function() {
         var id = this.id.split(",");
         var productid = id[0];
         var photoid = id[1];

         $('#productLongImageLarge').html('<img src="/images/products/' + productid + '/'
            + photoid + '.jpg">');
      });

      // Search field
      $('.searchField').keyup(function(e) {
         if (e.keyCode == 13)
            searchSubmit();
      });

      // Login
      $('input','#loginBlock').keyup(function(e) {
         if (e.keyCode == 13)
            loginSubmit();
      });
   },

   initializeCart : function() {
      var FLUID = this,
         $ = this.jQuery;

      // Remember the prior values
      $('.cartQuantitySelect').each(function() {
         var quantity = parseInt($(this).val());
         var id = this.id.split("_");
         var optionid = id[1];

         CARTQUANTITIES[optionid] = quantity;
      });

      // Cart quantity change
      $('.cartQuantitySelect').change(function() {
         var quantity = parseInt($(this).val());
         var id = this.id.split("_");
         var optionid = id[1];

         // Now update the quantity
         cartUpdateQuantity(optionid, quantity);
      });

   }

};

$(document).ready(function() {
   FLUID.init(); 
});

function locationHash(hash) {
   document.location.hash = hash;
}

function zeroPad(num, count) {
   var numZeropad = num + '';

   while(numZeropad.length < count)
      numZeropad = "0" + numZeropad;

   return numZeropad;
}

function getSalt() {
   return Math.floor(Math.random()*1000);
}

function evalJSON(responseText) {
   var json = eval('(' + responseText + ')');

   return json;
}

function check(json) {
   var check = parseInt(json.check);
   if (check == 0)
      return false;
                  
   return true;
}                 

function refresh() {
   location.reload(true);
}

function unescapeHTML(s) {
   s = unescape(s);

   return s.replace(/&(amp|[lg]t|quot);/g, function(m, p1) {
      var map = {
         amp: "&",
         lt: "<",
         gt: ">",
         quot: '"'
      };

      return map[p1];
   });


}

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 searchSubmit() {
   var value = trim($('.searchField').val());

   if (!value.length)
      return;

   value = escape(value);

   location.href = "/search.php?query=" + value;
}

//-----------------------
function toggleProductInventory() {
   if ($('.productInventory').is(":visible"))
      $('.productInventory').hide();
   else
      $('.productInventory').show();

}

function toggleProductSold() {
   if ($('.productSold').is(":visible"))
      $('.productSold').hide();
   else
      $('.productSold').show();

}     


//-----------------------
var FEATUREIMAGES = 0;
var FEATUREIMAGECURRENT = 1;
var FEATUREIMAGEMANUALSELECT = false;
var FEATUREIMAGESLOADING = false;
var FEATUREIMAGESTIMER = 5000;

function initializeFeatureImages(featureCount) {
   FEATUREIMAGES = featureCount;


   if (featureCount > 1) {
      setTimeout("featureImagesNext()", FEATUREIMAGESTIMER);

   }
}

function featureImagesNext() {
   if (!FEATUREIMAGES || FEATUREIMAGEMANUALSELECT)
      return;

   next = FEATUREIMAGECURRENT + 1;

   if (next > FEATUREIMAGES)
      next = 1;

   featureImagesLoad(next);
   setTimeout("featureImagesNext()", FEATUREIMAGESTIMER);
}

//var FEATUREIMAGEBLOCKOFFSET = 0;

function featureImagesLoad(next) {
   if (FEATUREIMAGESLOADING)
      return;

   FEATUREIMAGESLOADING = true; 
   var current = 'featureImage' + FEATUREIMAGECURRENT;
   var currentDot = 'featureImageDot' + FEATUREIMAGECURRENT;
   
   FEATUREIMAGECURRENT = next;
   
   var next = 'featureImage' + FEATUREIMAGECURRENT;
   var nextDot = 'featureImageDot' + FEATUREIMAGECURRENT;
   
   // Update the dot
   $('#' + currentDot + ' img').attr('src', "/images/dotgray.gif");
   $('#' + nextDot + ' img').attr('src', "/images/dotred.gif");
   $('#' + current).removeClass('active').addClass('lastActive');
   $('#' + next).css("opacity", 1.0).show();

   //FEATUREIMAGEBLOCKOFFSET += 900;

   // Set the next one to be offset 900px, show it with full opacity
   //$('#' + next).css("left", FEATUREIMAGEBLOCKOFFSET).show();

   // Move the entire block left
/*
   $('#featureImages').animate({ left: -FEATUREIMAGEBLOCKOFFSET }, 400, function() {
      $('#' + current).removeClass('active lastActive').hide();
      FEATUREIMAGESLOADING = false;
   });
*/

   $('#' + current).animate({ opacity: 0.0 }, 400, function() {
      $('#' + current).removeClass('active lastActive').hide();
      FEATUREIMAGESLOADING = false;
   });
}

//-----------------------
function cartAdd(optionType) {

   var optionToAdd = $('#productAdd_' + optionType).val().split(",");

   var productid = parseInt(optionToAdd[0]);
   var optionid = parseInt(optionToAdd[1]);

   if (productid == 0 || optionid == 0)
      return false;

   $("input[name='cartAddButton']",'#productAddBlock_' + 
      optionType).attr("disabled", true).val("...");

   var salt = getSalt();

   $.post('/ajax_cart.php', { salt : salt, c : "additem", 
      productid : productid, optionid : optionid }, function(data) {
      var json = evalJSON(data);

      if (check(json)) {
         confirm("Item added to cart");
         $('a', '#menulinkshoppingcart').text(json.layoutcartstring);

      } else {
         confirm(json.response);
      }
      $("input[name='cartAddButton']",'#productAddBlock_' + 
         optionType).attr("disabled", false).val("add");
   });

}

function cartUpdateQuantity(optionid, quantity, priorquantity) {

   if (quantity == 0) {
      if (!confirm("Are you sure you wish to remove this item from your shopping cart?")) {
         $('#optionQuantity_' + optionid).val(CARTQUANTITIES[optionid]);
         return false;
      }
   }

   var salt = getSalt();

   // Overlay something over the cart to disable changing anything
   $('input, select', '#cartBlock').attr("disabled", true);

   $.post('/ajax_cart.php', { salt : salt, c : "updatequantity", 
      optionid : optionid, quantity : quantity }, function(data) {
      var json = evalJSON(data);

      if (check(json)) {
         $('a', '#menulinkshoppingcart').text(json.layoutcartstring);
      } else {
         confirm(json.response);
         $('input, select', '#cartBlock').attr("disabled", false);
      }
      $('#cartBlock').html(unescape(json.cartblockstring));
      FLUID.initializeCart();

   });



}  

//-----------------------
function contactFormSubmit() {
   var error = false;
   var values = "";
   $("input[name='submit']",'.contactFormBlock').attr("disabled", true);
   $('input,textarea','.contactFormBlock').each(function() {
      if (values.length > 0)
         values += ",";

      var value = trim($(this).val());

      if (value.length <= 0)
         error = true;

      values += $(this).attr("name") + "=" + escape(value);
   });

   if (error) {
      confirm("All fields are required for valid submission");
      $("input[name='submit']",'.contactFormBlock').attr("disabled", false);
      return false;
   }

   $("input[name='submit']",'.contactFormBlock').val("submitting...");

   var salt = getSalt();

   $.post('/ajax_contactform.php', { salt : salt, values : values }, function(data) {
      var json = evalJSON(data);

      if (check(json)) {
         $('.contactFormBlock').html("<strong>" + json.response + "</strong>");
      } else {
         confirm(json.response);
         $("input[name='submit']",'.contactFormBlock').val("submit").attr("disabled", false);
      }
   });


}
         
function loginSubmit() {
   $("input[name='submit']",'#loginBlock').attr("disabled", true).val("verifying...");

   var un = escape($('#loginEmail').val());
   var pw = md5($('#loginPassword').val());

   var salt = getSalt();

   $.post('/ajax_login.php', { salt : salt, un : un, pw : pw }, function(data) {
      var json = evalJSON(data);

      if (check(json)) {
         //location.href = "/";
         setTimeout("refresh()", 1000);
      } else {
         confirm(json.response);
         $("input[name='submit']",'#loginBlock').val("sign in").attr("disabled", false);
      }
   });


}
 
//-----------------------
// Comments
function commentAdd(productid) {
   $("input[name='commentadd']",'#productLongCommentBlock').val("submitting...").attr("disabled", true);
   var comment = $('#comment').val();

   var salt = getSalt();

   $.post('/ajax_comment.php', { c : "add", 
      salt : salt, comment : comment, productid : productid }, function(data) {
      var json = evalJSON(data);

      if (check(json)) {
         $('#productLongCommentBlock').html(unescape(json.content));
      } else {
         confirm("There was an error while submitting the comment. Either the comment is too short or a similar one was already found");
         $("input[name='commentadd']",'#productLongCommentBlock').val("submit comment").attr("disabled", false);
      }
   });
}

function commentDelete(productid, commentid) {
   if (!confirm("Are you sure you want to delete this comment?"))
      return;

   var salt = getSalt();

   $.post('/ajax_comment.php', { c : "delete", 
      salt : salt, commentid : commentid, productid : productid }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         $('#productLongCommentBlock').html(unescape(json.content));
      } else {
         confirm("There was an error while deleting the comment. Refresh and try again");
      }
   });
}


//-----------------------
// Account create


function isValidEmailAddress(emailAddress) {
   var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
   return pattern.test(emailAddress);
}


function accountCreateSubmit() {
   var un = escape($('#accountCreateEmail').val());

   // Check for valid email
   if (!isValidEmailAddress($('#accountCreateEmail').val())) {
      confirm("Please enter a valid email address");
      return false;
   }


   // Check length
   if ($('#accountCreatePassword').val().length < 5) {
      confirm("Your password must be at least 5 characters long");
      return false;
   }

   var pw = md5($('#accountCreatePassword').val());
   var pwconf = md5($('#accountCreatePasswordConfirm').val());

   if (pw != pwconf) {
      confirm("Passwords do not match");
      return false;
   }

   $("input[name='submit']",'#accountCreateBlock').attr("disabled", true).val("creating...");

   var salt = getSalt();

   $.post('/ajax_account.php', { c : "create",
      salt : salt, un : un, pw : pw }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         refresh();
      } else {
         confirm(json.response);
         $("input[name='submit']",'#accountCreateBlock').val("create account").attr("disabled", false);
      }
   });
}

function accountUpdateSubmit() {
   // Obtain current email
   var cun = escape($('#accountUpdateCurrentEmail').val());
   var cpw = md5($('#accountUpdateCurrentPassword').val());

   // Now analyze anything new
   var email = escape(trim($('#accountUpdateEmail').val()));

   // Check for valid email
   if (email.length > 0 && !isValidEmailAddress($('#accountUpdateEmail').val())) {
      confirm("Please enter a valid email address");
      return false;
   }

   var pw = trim($('#accountUpdatePassword').val());

   if (pw.length > 0) {

      // Check for new pw
      // Check length
      if ($('#accountUpdatePassword').val().length < 5) {
         confirm("Your password must be at least 5 characters long");
         return false;
      }

      var pw = md5($('#accountUpdatePassword').val());
      var pwconf = md5($('#accountUpdatePasswordConfirm').val());

      if (pw != pwconf) {
         confirm("Passwords do not match");
         return false;
      }
   }

   if (pw.length == 0 && email.length == 0) {
      confirm("You need to enter a new password or email to update!");
      return false;
   }

   $("input[name='submit']",'#accountUpdateBlock').attr("disabled", true).val("updating...");



   var salt = getSalt();

   $.post('/ajax_account.php', { c : "update",
      salt : salt, cun : cun, cpw : cpw, email : email, pw : pw }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         confirm("Your account has been updated");
         refresh();
      } else {
         confirm(json.response);
         $("input[name='submit']",'#accountUpdateBlock').val("update account").attr("disabled", false);
      }
   });
}

function checkoutShippingSubmit(modifying) {
   var values = "";
   var error = false;
   var notRequiredFields = ["address2","province"];

   $('input,select','#shippingBlock').each(function() {
      var val = trim($(this).val());
      var name = $(this).attr("name");

      if (name == "submit")
         return;

      if ((val.length <= 0 && $.inArray(name,notRequiredFields) == -1)
         || (name == "country" && val == "0")) {

         $(this).css('background-color','#ecb8b8');
         error = true;
      } else
         $(this).css('background-color','');

      if (values.length > 0)
         values += ",";

      values += name + "=" + escape(val);
   });

   if (error)
      return false;

   $("input[name='submit']",'#shippingBlock').attr("disabled", true).val("verifying...");

   var salt = getSalt();

   var command = (modifying) ? "shippingmodifysubmit" : "shipping";

   $.post('/ajax_checkout.php', { c : command, 
      salt : salt, values : values }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         // Need to use this for some reason?? security issue for ie8?
         document.getElementById("checkoutContentBlock").innerHTML = unescape(json.content);

         // Need to use this for some reason?? security issue for ie8?
         //confirm(unescape(json.cartcontent));
         //document.getElementById('cartBlock').innerHTML = unescape(json.cartcontent);

         $('#cartBlock').html(unescape(json.cartcontent));
         locationHash(json.url);
      } else {
         confirm(json.response);
         $("input[name='submit']",'#shippingBlock').attr("disabled", false).val("next step");
      }
   });
}
 
function checkoutBillingSubmit(paybypaypal) {
   var values = "";
   var error = false;
   var notRequiredFields = ["address2","province"];

   $('input,select','#billingBlock').each(function() {
      var val = trim($(this).val());
      var name = $(this).attr("name");

      if (name == "submitcc")
         return;

      if (paybypaypal != 1 && ((val.length <= 0 && $.inArray(name,notRequiredFields) == -1)
         || (name == "country" && val == "0"))) {

         $(this).css('background-color','#ecb8b8');
         error = true;
      } else
         $(this).css('background-color','');

      if (values.length > 0)
         values += ",";

      values += name + "=" + escape(val);
   });

   values += ",paybypaypal=" + paybypaypal;

   if (error)
      return false;

   $("input[name='submit']",'#billingBlock').attr("disabled", true).val("verifying...");

   var salt = getSalt();

   $.post('/ajax_checkout.php', { c : "billing", 
      salt : salt, values : values }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         if (paybypaypal == 1) {
            location.href = json.paypalurl;
         } else {
            $('#checkoutContentBlock').html(unescape(json.content));
            locationHash(json.url);
         }
      } else {
         confirm(json.response);
         $("input[name='submit']",'#billingBlock').attr("disabled", false).val("next step");
      }
   });
}

function checkoutBillingModify() {
   $("input[name='button']",'#billingReviewBlock').attr("disabled", true).val("loading...");

   var salt = getSalt();

   $.post('/ajax_checkout.php', { c : "billingmodify", salt : salt }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         //$('#checkoutContentBlock').html(unescape(json.content));
         document.getElementById('checkoutContentBlock').innerHTML = unescape(json.content);
         locationHash(json.url);
      } else {
         location.href = '/checkout/billinginformation/';
      }
   });
}
 

function checkoutShippingModify() {
   $("input[name='button']",'#shippingReviewBlock').attr("disabled", true).val("loading...");

   var salt = getSalt();

   $.post('/ajax_checkout.php', { c : "shippingmodify", salt : salt }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         document.getElementById('checkoutContentBlock').innerHTML = unescape(json.content);
         $('#cartBlock').html(unescape(json.cartcontent));
         locationHash(json.url);
      } else {
         location.href = '/checkout/shippinginformation/';
      }
   });

}

function checkoutProcess(hash) {
   $("input[name='processTransaction']",'#checkoutProcessBlock').attr("disabled", true).val("processing...");

   var salt = getSalt();

   $.post('/ajax_checkout.php', { c : "process", salt : salt,
      hash : hash }, function(data) {

      var json = evalJSON(data);

      if (check(json)) {
         location.href = json.urlredirect;
      } else {
         document.getElementById('checkoutContentBlock').innerHTML = unescape(json.content);
         $("input[name='processTransaction']",'#checkoutProcessBlock').attr("disabled", false).val("Submit order &gt;");
      }
   });


}

//-----------------------


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=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=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;
 
   str = 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();
}

function utf8_encode(string) {
   string = (string+'').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;
} 


