﻿/// <reference name="jquery-1.3.2.js"/>

function r_click(rid) {
    $.ajax(
        {
            url: "rClick?id=" + rid,
            type: "Post",
            dataType: "Json",
            timeOut: 1000,
            success: null
        }
    );
    }
function StxtV(txtID, value) {
    var txt = $("#" + txtID);
    if (txt) {
        txt.val(value);
    }
}
function SddlV(selectID, value) {
    var select = $("#" + selectID);
    if (select) {
        select.val(value);
    }
}
var CheckInput = function() {
    this.isPass = true;
    var focusObj = null;
    var checkList = new Array();

    this.beginCheck = function() {
        this.isPass = true;
        focusObj = null;
        for (var i = 0; i < checkList.length; i++) {
            $("#" + checkList[i]).removeClass("inpError");
        }
    }
    this.endCheck = function() {
        if (focusObj != null) {
            focusObj.focus();
        }
        return this.isPass;
    }
    this.checkObject = function(CheckValue, obj, objID, message) {
        if (CheckValue) {
            var flag = false;
            for (var i = 0; i < checkList.length; i++) {
                if (checkList[i] == objID) {
                    flag = true;
                }
            }
            if (!flag) checkList.push(objID);
            obj.addClass("inpError");
            obj.attr("title", message);
            if (focusObj == null) {
                focusObj = obj;
                obj.focus();
            }
            this.isPass = false;
            return false;
        }
        this.isPass = this.isPass && true;
        return true;
    }
    this.setTitle=function(objID,title)
    {
        var obj= $("#" + objID);
        obj.attr("title",title);
    }
    this.checkSelectEqual= function(objID,equalValue, message) {
        var obj = $("#" + objID);
        return this.checkObject((obj.val() == equalValue), obj, objID, message);
    }
    this.checkTextEmpty = function(objID, message) {
        var obj = $("#" + objID);
        return this.checkObject((obj.val() == "" || obj.val().length <= 0), obj, objID, message);
    }
    this.checkTextMail = function(objID, message) {
        var obj = $("#" + objID);
        return this.checkObject(!this.IsMain(obj.val()), obj, objID, message);
    }
    this.isEqual=function(sourceID,ObjectID)
    {
        return this.isEqual(sourceID,ObjectID,"");
    }
    this.isEqual=function(sourceID,ObjectID,message)
    {
        var source = $("#" + sourceID);
        var obj = $("#" + ObjectID);
        var flag=(source.val()==obj.val());
        if(message!="")
        {
            this.checkObject(!flag,source,sourceID,message);
            this.checkObject(!flag,obj,ObjectID,message);
        }
        return flag;
    }
    this.checkTextNumber = function(objID, message) {

    }
    this.checkLeastLength = function(objID, len, message) {
        //检查长度是否太短
        var obj = $("#" + objID);
        return this.checkObject((obj.val().length < len), obj, objID, message);
    }
    this.TextBoxOnlyInputNumber = function(objID) {
        var obj = $("#" + objID);
        obj.keyup(function() {//先把非数字的都替换掉，除了数字和.
            obj.val(obj.val().replace(/[^\d.]/g, ""));
            //必须保证第一个为数字而不是.
            obj.val(obj.val().replace(/^\./g, ""));
            //保证只有出现一个.而没有多个.
            obj.val(obj.val().replace(/\.{2,}/g, "."));
            //保证.只出现一次，而不能出现两次以上
            obj.val(obj.val().replace(".", "$#$").replace(/\./g, "").replace("$#$", "."));
        });
    }
    this.CheckByReg = function(str, reg) {
        return reg.test(str);
    }
    this.IsTextEmpty = function(objID) {
        var obj = $("#" + objID);
        return (obj.val() == "" || obj.val().length <= 0);
    }
    this.IsMain = function(mail) {
        return this.CheckByReg(mail, /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/);
    }
}
function isChn(str)
{ 
    var reg = /^[\u4E00-\u9FA5]+$/; 
    return reg.test(str); 
}
function encodeText(objID)
{
    var kwInp=$("#"+objID);
    if(!isChn(kwInp.val()))
    {
        kwInp.val(encodeURI(kwInp.val()));
    }
    return true;
}
function SetHome(obj, vrl) {
    try {
        obj.style.behavior = 'url(#default#homepage)'; obj.setHomePage(vrl);
    }
    catch (e) {
        if (window.netscape) {
            try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            }
            catch (e) {
                alert("抱歉！您的浏览器不支持直接设为首页。请在浏览器地址栏输入“about:config”并回车然后将[signed.applets.codebase_principal_support]设置为“true”，点击“加入收藏”后忽略安全提示，即可设置成功。");
            }
            var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
            prefs.setCharPref('browser.startup.homepage', vrl);
        }
    }
}
function AddFavorite(sURL, sTitle) {
    try {
        window.external.addFavorite(sURL, sTitle);
    }
    catch (e) {
        try {
            window.sidebar.addPanel(sTitle, sURL, "");
        }
        catch (e) {
            alert("加入收藏失败，请使用Ctrl+D进行添加");
        }
    }
}

function sczfInfo(cate, objID) {
    var cateURL;
    if (cate = 1)
        cateURL = "/CZFang/";
    else if (cate = 2)
        cateURL = "/QZFang/";
    $.get(cateURL + "Favorites/" + objID + "?rnd=" + Math.random(), null, function(data, textStatus) {
            if (data == 2)
                ShowToolTip("很高兴地告诉您，该信息您已经收藏过了！");
            else if (data == 1)
                ShowToolTip("恭喜您，收藏成功！");
            else if (data == -3)
                ShowToolTip("对不起！您当前未登录，请登录后再进行收藏操作。");
            else if (data == -2)
                ShowToolTip("收藏请求参数错误，请重新操作或联系我们。");
            else if (data == -1)
                ShowToolTip("创建收藏记录失败，请重新操作或联系我们。");
            else if (data ==0)
                ShowToolTip("对不起！您要收藏的信息已不存在，请刷新页面后重试。");
            else
                ShowToolTip("收藏请求失败，请重新操作，如果问题还是存在请联系我们。谢谢！");
        });
    }
    function getPageSize() {

        var xScroll, yScroll;

        if (window.innerHeight && window.scrollMaxY) {
            xScroll = document.body.scrollWidth;
            yScroll = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }

        var windowWidth, windowHeight;
        if (self.innerHeight) {	// all except Explorer
            windowWidth = self.innerWidth;
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        }

        // for small pages with total height less then height of the viewport
        if (yScroll < windowHeight) {
            pageHeight = windowHeight;
        } else {
            pageHeight = yScroll;
        }

        // for small pages with total width less then width of the viewport
        if (xScroll < windowWidth) {
            pageWidth = windowWidth;
        } else {
            pageWidth = xScroll;
        }


        arrayPageSize = new Array(pageWidth, pageHeight, windowWidth, windowHeight)
        return arrayPageSize;
    }
    var ShowToolTipInterval=null;
    function ShowToolTip(msg,event) {

        var dialog = $("#dia_ToolTip");
        if (dialog.length > 0) dialog.remove();
         dialog=$("<div></div>").css({ 'width': '400px',
            'background': '#A2D959',
            'margin': '30px auto',
            'border': '10px solid #8FD401',
            'padding': '10px',
            'z-index': '102',
            'position': 'absolute',
            'text-align': 'center',
            'left': ($(document).width() - 400) / 2,
            'top':$(document).scrollTop()+50
        }).appendTo('body');
        dialog.attr("ID", "dia_ToolTip");
    dialog.text(msg);
    dialog.show("fast");
    window.clearInterval(ShowToolTipInterval);
    ShowToolTipInterval=setInterval("$('#dia_ToolTip').hide('slow');", 5000);
    return true;
    }
function DIVDialog(hdivOverlay, hdivOverlayLayerID) {
    this.hdivOverlay = hdivOverlay;
    this.hdivOverlayLayer = hdivOverlayLayerID;
    this.Show = function() {
        this.Enabled("select", false);
        $("#" + this.hdivOverlay).show();
        $("#" + this.hdivOverlayLayer).show();
        var parentDIV = document.getElementById(this.hdivOverlayLayer).parentNode;
        $(parentDIV).show();
        if ($.browser.version < 7) {
            var ps = getPageSize();
            parentDIV.style.height = document.getElementById(this.hdivOverlay).style.height = ps[1];
            parentDIV.style.width = document.getElementById(this.hdivOverlay).style.width = ps[0];
        }
    }
    this.Close = function() {
        $("#" + this.hdivOverlay).hide();
        $("#" + this.hdivOverlayLayer).hide();
        $(document.getElementById(this.hdivOverlayLayer).parentNode).hide();
        this.Enabled("select", true);
    }
    this.Resize = function() {
        var ps = getPageSize();
        document.getElementById(this.hdivOverlay).style.height = ps[1];
        document.getElementById(this.hdivOverlay).style.width = ps[0];
    }
    this.Enabled = function(control, isVisible) {
        var list = $(control);
        if (list != null && list.length > 0) {
            for (var i = 0; i < list.length; i++) {
                if (isVisible)
                    $(list[i]).show();
                else
                    $(list[i]).hide();
            }
        }

    }
}
//创建GMap类的实例
var map = null;
var geocoder = null;
var bounds = null;

//创建地图
//mapControlName-地图控件ID
//points--经纬度集合 Array(); 格式： ["索引号:Longitude经度:Latitude纬度"]
//markCategory--标记分类：ZhFang,Car,...
//hasEvent--是否含有事件
function CreateMap(mapControlID, points, markCategory, hasEvent, pointCount, listControlID, defaultPoint) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById(mapControlID));

        if (hasEvent) {
            map.enableScrollWheelZoom();
            map.addControl(new GSmallMapControl());
        }

        geocoder = new GClientGeocoder();
        bounds = new GLatLngBounds();

        var strPoint = new Array();
        strPoint = defaultPoint.split(":");
        var dPoint = new GLatLng(parseFloat(strPoint[0]), parseFloat(strPoint[1]));
        map.setCenter(dPoint, 13);

        var count = 0;
        var lastPoint;

        var pointCount = 0;

        if (points.length > 0) {
            for (var i = 0; i < points.length; i++) {
                var strArray = new Array();
                strArray = points[i].split(":");

                if (strArray[1] != "0" && strArray[2] != "0") {

                    pointCount++;

                    var point = new GLatLng(parseFloat(strArray[2]), parseFloat(strArray[1]));

                    var marker;

                    if (hasEvent) {
                        marker = createMarker(point, i + 1, markCategory, hasEvent, pointCount, listControlID);
                    }
                    else {
                        marker = new GMarker(point);
                    }

                    map.addOverlay(marker);

                    bounds.extend(point);

                    lastPoint = point;

                    count++;
                }
            }
        }

        if (pointCount > 0) {

            var _Zoom = map.getBoundsZoomLevel(bounds); //设置绽放级别

            map.setCenter(bounds.getCenter(), _Zoom); //设置中心点
        }
    }
}


//自定义标记
//point-经纬度:GLatLng
//index-索引号
//markCategory--标记分类：ZhFang,Car,...
//hasEvent--是否含有事件
function createMarker(point, index, markCategory, hasEvent, pointCount, listControlID) {

    var markerHtml = document.createElement('div');
    var markerTip = document.createElement('div');
    var marker = new GOverlay();
    marker.initialize = function(map_) {
        markerHtml.setAttribute("index", index);
        markerHtml.setAttribute("id", "hdivGoogleMapMarker_" + index);
        markerHtml.innerHTML = '<div id="hdivGoogleMapMarkerIcon_' + index.toString() + '" class="PointMarker PointMarker_' + markCategory + '0" style="cursor:pointer;"><span>' + index.toString() + '</span></div>';
        markerHtml.style.position = "absolute";
        map_.getPane(G_MAP_MARKER_PANE).appendChild(markerHtml);

        //var tip = document.getElementById("hdivToolTip_" + index.toString());
        var title = document.getElementById("hspanTitle" + index.toString()).innerText;
        var href = document.getElementById("haLink" + index.toString()).href;
        var detial = document.getElementById("htdDetial" + index.toString()).innerText;
        var form = document.getElementById("haFrom" + index.toString()).innerText;

        markerTip.setAttribute("index", index);
        markerTip.setAttribute("id", "hdivGoogleMarkToolTip_" + index);
        var strTipHTML = '<div style="z-index:1000" class="MarkerTip">';
        strTipHTML += '<div class="Title">';
        strTipHTML += '<span>';
        strTipHTML += title;
        strTipHTML += '</span>';
        strTipHTML += '<div class="close" onclick="closeTip(' + index.toString() + ',\'' + markCategory + '\');">';
        strTipHTML += '</div>';
        strTipHTML += '</div>';
        strTipHTML += '<div style="padding-left: 5px;">';
        strTipHTML += '<a style="line-height: 20px;" target="_blank" href="' + href + '">';
        strTipHTML += '更多信息 </a>';
        strTipHTML += '<div style="color: #999; font-size: 12px; line-height: 18px;">';
        strTipHTML += detial;
        strTipHTML += '</div>';
        strTipHTML += '<div style="color: Green; text-align: right; padding-right: 5px;">';
        strTipHTML += form;
        strTipHTML += '</div>';
        strTipHTML += '</div>';
        strTipHTML += '</div>';

        markerTip.innerHTML = strTipHTML;

        markerTip.style.position = "absolute";
        markerTip.style.display = "none";
        map_.getPane(G_MAP_MARKER_PANE).appendChild(markerTip);

        if (hasEvent) {
            GEvent.addDomListener(markerHtml, "mouseover", function() {
                document.getElementById("htdDateItem_" + index.toString()).style.background = '#ebf4ff';

                document.getElementById("hdivMarker_" + index.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "1");
                markerHtml.setAttribute("class", "PointMarker PointMarker_" + markCategory + "1");

                document.getElementById("hdivMarker_" + index.toString()).className = "PointMarker PointMarker_" + markCategory + "1";
                markerHtml.className = "PointMarker PointMarker_" + markCategory + "1";

                var newIndex = index + 10;
                markerHtml.style.zIndex = newIndex;
            });
            GEvent.addDomListener(markerHtml, "mouseout", function() {
                if (markerTip.style.display == "none") {
                    document.getElementById("htdDateItem_" + index.toString()).style.background = 'White';

                    document.getElementById("hdivMarker_" + index.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");
                    markerHtml.setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");

                    document.getElementById("hdivMarker_" + index.toString()).className = "PointMarker PointMarker_" + markCategory + "0";
                    markerHtml.className = "PointMarker PointMarker_" + markCategory + "0";

                    markerHtml.style.zIndex = index;
                }
            });

            GEvent.addDomListener(markerHtml, "click", function() {
                for (var i = 1; i < pointCount + 1; i++) {

                    var marker = document.getElementById("hdivMarker_" + i.toString());

                    if (marker != null) {
                        if (i == index) {
                            document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.display = "block";

                            document.getElementById("htdDateItem_" + i.toString()).style.background = '#ebf4ff';

                            marker.setAttribute("class", "PointMarker PointMarker_" + markCategory + "1");
                            document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "1");

                            marker.className = "PointMarker PointMarker_" + markCategory + "1";
                            document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).className = "PointMarker PointMarker_" + markCategory + "1";

                            map.setCenter(point);

                            var hdivList = document.getElementById(listControlID);
                            hdivList.scrollTop = 82 + 160 * (index - 1);

                            var newIndex = index + 10;
                            document.getElementById("hdivGoogleMapMarker_" + i.toString()).style.zIndex = newIndex;
                            document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.zIndex = newIndex;
                        }
                        else {
                            document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.display = "none";

                            document.getElementById("htdDateItem_" + i.toString()).style.background = 'White';

                            marker.setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");
                            document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");

                            marker.className = "PointMarker PointMarker_" + markCategory + "0";
                            document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).className = "PointMarker PointMarker_" + markCategory + "0";

                            document.getElementById("hdivGoogleMapMarker_" + i.toString()).style.zIndex = index;
                            document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.zIndex = index;
                        }
                    }
                }
            });
        }
    }

    marker.redraw = function(force) {
        if (force) {
            var p = map.fromLatLngToDivPixel(point);
            markerHtml.style.left = (p.x) - 12 + "px";
            markerHtml.style.top = (p.y) - 12 + "px";
            markerTip.style.left = (p.x) + 12 + "px";
            markerTip.style.top = (p.y) - 12 + "px";
        }
    };

    return marker;
}

function closeTip(index, markCategory) {
    document.getElementById("hdivGoogleMarkToolTip_" + index.toString()).style.display = "none";

    document.getElementById("htdDateItem_" + index.toString()).style.background = 'White';

    document.getElementById("hdivMarker_" + index.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");
    document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).setAttribute("class", "PointMarker PointMarker_" + markCategory + "0");

    document.getElementById("hdivMarker_" + index.toString()).className = "PointMarker PointMarker_" + markCategory + "0";
    document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).className = "PointMarker PointMarker_" + markCategory + "0";

    document.getElementById("hdivGoogleMapMarker_" + index.toString()).style.zIndex = index;
    document.getElementById("hdivGoogleMarkToolTip_" + index.toString()).style.zIndex = index;

}

function ReSize() {
    document.getElementById("hdivList").style.height = document.documentElement.clientHeight - 135 + "px";
    document.getElementById("hdivMap").style.height = document.documentElement.clientHeight - 135 + "px";
}

function onItemActive(obj, index) {

    var ToolTip = document.getElementById("hdivGoogleMarkToolTip_" + index.toString());

    obj.style.background = '#ebf4ff';

    var marker = document.getElementById("hdivMarker_" + index.toString());

    if (marker != null) {
        marker.setAttribute("class", "PointMarker PointMarker_ZuFang1");
        document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).setAttribute("class", "PointMarker PointMarker_ZuFang1");

        marker.className = "PointMarker PointMarker_ZuFang1";
        document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).className = "PointMarker PointMarker_ZuFang1";

        var newIndex = index + 10;
        document.getElementById("hdivGoogleMapMarker_" + index.toString()).style.zIndex = newIndex;
    }
}

function onItemLostActive(obj, index) {

    var ToolTip = document.getElementById("hdivGoogleMarkToolTip_" + index.toString());

    if (ToolTip == null || (ToolTip != null && ToolTip.style.display == "none")) {
        obj.style.background = 'White';
    }

    var marker = document.getElementById("hdivMarker_" + index.toString());

    if (marker != null) {
        if (document.getElementById("hdivGoogleMarkToolTip_" + index.toString()).style.display == "none") {

            marker.setAttribute("class", "PointMarker PointMarker_ZuFang0");
            document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).setAttribute("class", "PointMarker PointMarker_ZuFang0");

            marker.className = "PointMarker PointMarker_ZuFang0";
            document.getElementById("hdivGoogleMapMarkerIcon_" + index.toString()).className = "PointMarker PointMarker_ZuFang0";

            document.getElementById("hdivGoogleMapMarker_" + index.toString()).style.zIndex = index;
        }
    }
}

function onItemClick(obj, index) {

    for (var i = 1; i < 11; i++) {
        var marker = document.getElementById("hdivMarker_" + i.toString());

        if (marker != null) {
            if (i == index) {

                document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.display = "block";

                document.getElementById("htdDateItem_" + i.toString()).style.background = '#ebf4ff';

                marker.setAttribute("class", "PointMarker PointMarker_ZuFang1");
                document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).setAttribute("class", "PointMarker PointMarker_ZuFang1");

                marker.className = "PointMarker PointMarker_ZuFang1";
                document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).className = "PointMarker PointMarker_ZuFang1";

                var lon = document.getElementById("htxtLon" + i.toString()).value;
                var lat = document.getElementById("htxtLat" + i.toString()).value;

                var point = new GLatLng(parseFloat(lat), parseFloat(lon));
                map.setCenter(point);

                var newIndex = index + 10;
                document.getElementById("hdivGoogleMapMarker_" + index.toString()).style.zIndex = newIndex;
                document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.zIndex = newIndex;
            }
            else {
                document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.display = "none";

                document.getElementById("htdDateItem_" + i.toString()).style.background = 'White';

                marker.setAttribute("class", "PointMarker PointMarker_ZuFang0");
                document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).setAttribute("class", "PointMarker PointMarker_ZuFang0");

                marker.className = "PointMarker PointMarker_ZuFang0";
                document.getElementById("hdivGoogleMapMarkerIcon_" + i.toString()).className = "PointMarker PointMarker_ZuFang0";

                document.getElementById("hdivGoogleMapMarker_" + i.toString()).style.zIndex = index;
                document.getElementById("hdivGoogleMarkToolTip_" + i.toString()).style.zIndex = index;
            }
        }
    }
}

function MD5(value, bit) {
    var sMessage = value;
    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(sMessage) {
        var lWordCount;
        var lMessageLength = sMessage.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] | (sMessage.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;
    }
    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;
    // Steps 1 and 2. Append padding bits and length and convert to words 
    x = ConvertToWordArray(sMessage);
    // Step 3. Initialise 
    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
    // Step 4. Process the message in 16-word blocks 
    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);
    }
    if (bit == 32) {
        return WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
    }
    else {
        return WordToHex(b) + WordToHex(c);
    }
}