    /*******************************
	*  Developed by: Anar Alishov  *
	*  Company: anarsoft.com       *
	*                              *
	*    support@anarsoft.com      *
	*                              *
	*   http://www.anarsoft.com    *
	* (C)2006 All right reserverd. *
	*******************************/

	var userAgent = navigator.userAgent.toLowerCase()

	var is_op = (userAgent.indexOf("opera") != -1)
	var is_ie = (userAgent.indexOf("msie") != -1) && !is_op
	var is_ff = (userAgent.indexOf("firefox") != -1)

	/* Mouse Move */
	var mouse = {}
	mouse['x'] = 0
	mouse['y'] = 0
	mouse['e'] = null

	if (document.layers) document.captureEvents(Event.MOUSEMOVE)
	document.onmousemove = mousetrack
	window.onmousemove = mousetrack

	function fo(_e, _doc) {
		if (!_doc) _doc = document
		return _doc.getElementById(_e)
	}
	
	function $comment(name, _url) {
		if (!_url) _url = window.location.href
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "([#]"+name+")";
		var regex = new RegExp(regexS);
		var results = regex.exec(_url);
		return (results != null) ? results[1] : "";
	}

	/**
	 * getElementsByClassName
	 */
	function $className(classname, node) {
		if(!node) node = document.getElementsByTagName("body")[0];
		var a = [];
		var re = new RegExp('\\b' + classname + '\\b');
		var els = node.getElementsByTagName("*");
		for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className))a.push(els[i]);
		return a;
	}												

    var mainWidth  = 0
    var mainHeight = 0
    function getMainWidthHeight() {
        mainWidth  = Number(getw(document.body))
        mainHeight = Number(geth(document.body))
    }

    opening = false
    currentOpennedType = ''
    function backgroundFullyTurnOff() {
            if (opening) {
                    opening = false
                    return opening
            }
            var box = $(currentOpennedType+'Box')
            if (!box)
                    return true
            if (mie(mouse.x, mouse.y, box))
                    return true
            var box = 'mainBoxBG'
            if (SwitchDIVState(box))
                boxSwitch(currentOpennedType)
            return true
    }

    function backgroundSwitch(box) {
            getMainWidthHeight()
            if (!box) box = 'mainBoxBG'
            $(box).style.top = 0 + 'px'
            $(box).style.left = 0 + 'px'
            $(box).style.width = mainWidth + 'px'
            $(box).style.height = mainHeight + 'px'
            $(box).style.zIndex = '100'
            toggleSwitchDIV('mainBoxBG');
    }

    boxPosiotions = []
    function boxSwitch(type, width, height, cX, cY) {
        opening = true
        currentOpennedType = type
        backgroundSwitch()

        var box = type

        if (!boxPosiotions[type]) {
            boxPosiotions[type] = {}
            boxPosiotions[type].width = Number(width) + Number(cX)
            boxPosiotions[type].height = Number(height) + Number(cY)
            width = boxPosiotions[type].width
            height = boxPosiotions[type].height
            if (width == undefined) width = 1
            if (height == undefined) height = 1
            $(box).style.width = width + 'px'
            $(box).style.height = height + 'px'
            $(box).style.zIndex = '101'
        }
        var left= Number(window.getSize().x / 2) - Number(width / 2) + scrollLeft() - cX
        var top = Number(window.getSize().y / 2) - Number(height / 2) + scrollTop() - cY - 20
        $(box).style.top = top + 'px'
        $(box).style.left = left + 'px'
        toggleSwitchDIV(box);
    }

	function mousetrack(e) {
		if (!is_ie) {
			/* Window Pos */
			mouse.x = e.pageX
			mouse.y = e.pageY
			mouse.e = e
		} else {
			/* Window Pos */
			mouse.x = event.x + scrollLeft()
			mouse.y = event.y + scrollTop()
			mouse.e = event
		}
	}

	function whenLoading () {
//		alert('whenLoading');
	}

	function whenLoaded () {
//		alert('whenLoaded');
	}

	function whenInteractive () {
//		alert('whenInteractive');
	}

	function whenCompleted () {
		if (ajaxObject.responseStatus){
			ajaxObject.OnCompleteFunctionCall(ajaxObject.responseStatus, ajaxObject.response);
		}
	}

	var ajaxDIV = null
	var ajaxURL = null

	function whenError () {
//		alert('whenError');
//		alert("ERROR: Can't conect to server.");
//		ajaxObject = null
//		ajaxObject = new sack();
		ajaxDIV.innerHTML = '���������� ��������� ������.����� �������.�� ������' + ajaxURL;
	}

	function CallData(url, div, callBack) {
		div.innerHTML = '<img src="http://www.tonis.ua/public/images/ua/design-1/loading.gif" alt="'+url+'" />';
		ajaxURL = url
		ajaxDIV = div
		ajax(url, 'GET', callBack);
	}

	function ajax (url, method, functionName) {
//		var form = document.getElementById('form');
//		ajaxObject.setVar("myTextBox", form.mytext.value); // recomended method of setting data to be parsed.
//		ajaxObject.requestFile = "sackdemo.php";
//		ajaxObject.method = form.method.value;
//		ajaxObject.element = 'replaceme';
		ajaxObject = null
		ajaxObject = new sack();
		ajaxObject.method = method;
		ajaxObject.onLoading = whenLoading;
		ajaxObject.onLoaded = whenLoaded; 
		ajaxObject.onInteractive = whenInteractive;
		ajaxObject.onCompletion = whenCompleted;
		ajaxObject.onError = whenError;
		ajaxObject.onFail = whenError;
		ajaxObject.OnCompleteFunctionCall = functionName;
		ajaxObject.runAJAX(url);
	}

	function wOpen(urlVar, optionsVar) {
		var newWindow = window.open(urlVar, '', optionsVar)
	}

	function textFunctions(obj, Command) {
		obj = findObject(obj)
		obj.setActive()
		callCmd(Command)
	}

	function callCmd(sFormatString) {
		document.execCommand(sFormatString)
	}

	function setValue(obj, value) {
		obj = findObject(obj)
		obj.value = value
	}
        
	function setHTML(obj, value) {
		obj = findObject(obj)
		obj.innerHTML = value
	}

	function preg_replace(tsearch, treplace, text) {
		var t = text.toString()
		var sch = new RegExp(tsearch, 'gi')
		return t.replace(sch, treplace)
	}
        
	function d(_name, _str) {
		obj = findObj('debug' + _name)
		if (obj) {
			if (is_ie) obj.innerText = _str
			if (is_op) obj.innerText = _str 
			if (is_ff) obj.textContent = _str
		}
	}

	function dp(_name, _str) {
		obj = findObj('debug' + _name)
		if (obj) {
			if (is_ie) obj.innerText += _str
			if (is_op) obj.innerText += _str
			if (is_ff) obj.textContent += _str
		}
	}

	function findObj(n, d) {
		var p,i,x;
		x = null
		if(!d) d=document;
		if (!x && d.getElementById)
			x=d.getElementById(n);
		return x;
	}

	function findObject(n, d) {
		var p,i,x;
		x = null
		if(!d) d=document;
		if (!(x=d[n])&&d.all)
			x=d.all[n];
		for (i=0;!x&&i<d.forms.length;i++)
			x=d.forms[i][n];
		for (i=0;!x&&d.layers&&i<d.layers.length;i++)
			x=findObject(n, d.layers[i].document);/**/
		if (!x && d.getElementById)
			x=d.getElementById(n);
		return x;
	}

	function preloadImages() {
		var d=document;
	  	if (d.images) {
	  		if(!d.p) d.p=new Array();
		    var i, j=d.p.length, a=preloadImages.arguments;
		    for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0) {
		    	d.p[j]=new Image; d.p[j++].src=a[i];
		    }
		}
	}

	function swapImgRestore() {
		var i,x,a=document.sr;
		for (i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++)
			x.src=x.oSrc;
	}

	function swapImage() {
		var i,j=0,x,a=swapImage.arguments;
		document.sr = new Array;
		for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null) {
			document.sr[j++]=x;
			if(!x.oSrc) x.oSrc=x.src;
			x.src=a[i+2];
		}
	}

	function scrWidth() {
		var myWidth = 0, myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
		  //Non-IE
		  myWidth = window.innerWidth;
//		  myHeight = window.innerHeight;
		} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		  //IE 6+ in 'standards compliant mode'
		  myWidth = document.documentElement.clientWidth;
//		  myHeight = document.documentElement.clientHeight;
		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		  //IE 4 compatible
		  myWidth = document.body.clientWidth;
//		  myHeight = document.body.clientHeight;
		}
		return myWidth;
	}

	function scrHeight() {
		var myWidth = 0, myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
		  //Non-IE
//		  myWidth = window.innerWidth;
		  myHeight = window.innerHeight;
		} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		  //IE 6+ in 'standards compliant mode'
//		  myWidth = document.documentElement.clientWidth;
		  myHeight = document.documentElement.clientHeight;
		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		  //IE 4 compatible
//		  myWidth = document.body.clientWidth;
		  myHeight = document.body.clientHeight;
		}
		return myHeight;
	}


	function screenWidth() {
	    if (document.body.clientWidth)
	        return document.body.clientWidth;
	    if (document.documentElement.clientWidth)
	        return document.documentElement.clientWidth
		return false;
	}
    
	function screenHeight() {
	    if (document.body.clientHeight)
	        return document.body.clientHeight;
	    if (document.documentElement.clientHeight)
	        return document.documentElement.clientHeight
		return false;
	}

	function scrollTop () {
	    if (window.innerHeight)
	        return window.pageYOffset;
	    if (document.documentElement && document.documentElement.scrollTop)
	        return document.documentElement.scrollTop;
	    if (document.body)
	        return document.body.scrollTop;
	}

	function scrollLeft () {
	    if (window.innerWidth)
	        return window.pageXOffset;
	    if (document.documentElement && document.documentElement.scrollLeft)
	        return document.documentElement.scrollLeft;
	    if (document.body)
	        return document.body.scrollLeft;
	}

	function toscrollLeft (x) {
	    if (window.innerWidth)
	        window.pageXOffset = x;
	    if (document.documentElement && document.documentElement.scrollLeft)
	        document.documentElement.scrollLeft = x;
	    if (document.body)
	        document.body.scrollLeft = x;
	}

	function mies_current (l, t, poses) {
		var result = null
		var ss = ''
		for (key in poses) {
			if (mib(l, t, poses[key]))
				result = key
		}
		return result
	}

	// Mouse In Elements Zone?
	function mies (l, t, poses, sets) {
		var cur = mies_current(l, t, poses)
		if (cur == null) return false
		return true
	}

	function mies_name (l, t, poses, name) {
		var cur = mies_current(l, t, poses)
		if (cur == null || (!(name in poses))) return false
		return true
	}

	// What Zone of Elements Number?
	function miesNo (l, t, arr) {
		if (arr.length == 0) return false
		for (key in arr)
			if (mib(l, t, arr[key])) return key
		return false
	}

	function is_parent(cur, k, childs, parents) {
		if (childs[cur] == k) {
			return true
		} else {
			if (cur in childs)
				return is_parent(parents[cur], k, childs)
			else
				return false
		}
	}

	function mies_clear (l, t, poses, childs, parents) {
		var n = {}
		var cs = false
		var cur = mies_current(l, t, poses);
		var v = ''
		if (cur != null) {
			for (key in childs) {
				if (!cs) {
					n[key] = childs[key]
					if (key == cur || childs[key] == cur) {
						cs = false
						continue
					}
				} else {
					window._menu_droped[childs[key]] = false
				}
			}
		}
		return n
	}

	// Mouse In Element?
	function mie (l, t, obj) {
		if (obj == null) return false
		var c = {x:0, y:0, w:0, h:0}
		c.x = getcx(obj);
		c.y = getcy(obj);
		c.w = getw(obj);
		c.h = geth(obj);
// alert(c.x +', '+ c.y +', '+ c.w +', '+ c.h)
		return mib(l, t, c);
	}
	
	// Mouse In Box?
	function mib (l, t, c) {
		if (is_ie) {
			l += scrollLeft()
			t += scrollTop()
		}
		if ( (l>=c.x && l<=c.x+c.w) && (t>=c.y && t<=c.y+c.h)) return true;
		else return false;
	}
	
	function box (obj) {
		if (obj == null) return false
		var c = {}
		c.x = getx(obj)
		c.y = gety(obj)
		c.w = getw(obj)
		c.h = geth(obj)
		return c;
	}
	
	function getwx (obj) {
		if (obj == null) return 0;
		var x = 0;
		do { x += obj.offsetLeft;
			obj = obj.offsetParent;
		} while (obj);
		x -= scrollLeft();
		return x;
	}
    
	function getwy (obj) {
		if (obj == null) return 0;
		var y = 0;
		do {y += obj.offsetTop;
			obj = obj.offsetParent;
		} while (obj);
		y -= scrollTop();
		return y;
	}
	
	function getcx (obj) {
		if (obj == null) return 0;
		var x = 0;
		do { x += obj.offsetLeft;
			obj = obj.offsetParent;
		} while (obj);
		return x;
	}
    
	function getcy (obj) {
		if (obj == null) return 0;
		var y = 0;
		do {y += obj.offsetTop;
			obj = obj.offsetParent;
		} while (obj);
		return y;
	}
	
	function getx (obj) {
		if (obj == null) return 0;
		var x = 0;
		do { x += obj.offsetLeft;
			obj = obj.offsetParent;
		} while (obj);
		return x;
	}
    
	function gety (obj) {
		if (obj == null) return 0;
		var y = 0;
		do {y += obj.offsetTop;
			obj = obj.offsetParent;
		} while (obj);
		return y;
	}
	
	function getw(obj) {
		if (obj == null) return 0;
		var width = obj.offsetWidth;
		if (width > 0)	return width;
		if (!obj.firstChild) return 0;
    	return obj.lastChild.offsetLeft - obj.firstChild.offsetLeft + getw(obj.lastChild);
	}
	
	function geth (obj) {
		if (obj == null) return 0;
		var height = obj.offsetHeight;
		if (height > 0) return height;
		if (!obj.firstChild) return 0;
		return obj.firstChild.offsetHeight;
	}

	function SetEvent(object, event, functionName) {
	    var func = null
        eval("func = function anonymous()\n{\n" + functionName + "\n}")
    	object[event] = func
	}

	function s(str) {
		window.status = str;
	}

	function allCheckBox (form, cbs, stat) {
		cbs = findObject(cbs)
		if (cbs.length>0) {
			for(i=0;i<cbs.length;i++)
				cbs[i].checked = stat
		} else
			cbs.checked = stat
	}

	function SelectAllCBs (self, cbs, countNo) {
	    var rootcbs = cbs
		cbs = null
	    for(c=1;c<countNo;c++) {
			cbs = findObject(rootcbs+''+c)
			if (cbs != null) {
				if (cbs.length>0) {
					for (box in cbs)
						cbs[box].checked = self.checked
				} else
					cbs.checked = self.checked
			}
		}
	}

	function isCheckedBox (form, cbs) {
		if (form[cbs].length>0) {
			for(i=0;i<form[cbs].length;i++)
				if (form[cbs][i].checked) return true
		} else if (form[cbs].checked) return true
		document.all.maincb.checked = false
		return false
	}

	function toggleDIV(self, div, side) {
		x = getx(self);
		y = gety(self);
		w = getw(self);
		h = geth(self);
		dw = getw(document.all[div]);
		if (side == null) side = true
		if (side)
			document.all[div].style.left = x + w + 2;
		else
			document.all[div].style.left = x - dw;
		document.all[div].style.top = y;
		if (document.all[div].style.visibility == 'hidden') {
			self.value = '-';
			document.all[div].style.visibility='visible'
		} else {
			self.value = '+';
			document.all[div].style.left = 0;
			document.all[div].style.top = 0;
			document.all[div].style.visibility='hidden'
		}
	}

	function allDDMenus (stat) {
		for(o=0;o<document.forms.length;o++) {
			for(en=0;en<document.forms[o].elements.length;en++) {
				e = document.forms[o].elements[en]
				if (e.type == 'select-one') {
					e.style.visibility = stat
				}
			}
		}
	}

	function tabPage(prefix, page, on, off, bprefix, bon, boff) {

		var btnPages = document.getElementsByTagName('TH')
		var tabPages = document.getElementsByTagName('DIV')
		var td = document.getElementById('tabsPagesTD')
		var tdh = geth(td)
		if (tdh > 0) 
			tdh = Number(tdh) - 5

		for(e=0;e<btnPages.length;e++) {
			if (btnPages[e].id == bprefix) {
				if (e == page) {
					btnPages[e].className = bon
				} else {
					btnPages[e].className = boff
				}
			}
		}

		for(e=0;e<tabPages.length;e++)
			if (tabPages[e].id == prefix) {
			if (e == page) {
				tabPages[e].className = on
				if (tabPages[e].hasChildNodes()) {
					if (tabPages[e].childNodes[0])
						if (tabPages[e].childNodes[0].tagName == 'TABLE')
							tabPages[e].childNodes[0].style.height = tdh
					if (tabPages[e].childNodes[1])
						if (tabPages[e].childNodes[1].tagName == 'TABLE')
							tabPages[e].childNodes[1].style.height = tdh
				}
			} else {
				tabPages[e].className = off
			}
		}
	}

	function SwitchDIVc(field) {
		var cb = findObject(field);
		if (cb.className == 'on') {
			cb.className = 'off'
			return 0;
		} else {
			cb.className = 'on'
			return 1;
		}
	}

	function SwitchDIVState(field) {
		var cb = findObject(field);
		return (cb.style.display == '' ? true : false)
	}

	function toggleSwitchDIV(field, x, y) {
		var result = !SwitchDIVState(field)
		SwitchDIV(field, result, x, y)
		return result
	}
	
	function switchPasswdInput(_text, _input, _state) {
		switch (_state) {
			case true:
				SwitchDIV(_text, state);
				break;
			case false:
				SwitchDIV(_text, state);
			break;
		}
	}

	function SwitchDIV(field, state, x, y) {
		var cb = findObject(field);
		if (state == null) state = cb.style.display
		if (state) state = 'none'
		if (!state) state = ''
		if (x != null) {
			cb.style.left = x + 'px';
		}
		if (y != null) {
			cb.style.top = y + 'px';
		}
		if (state == '') {
			cb.style.display = 'none'
			cb.style.visibility = 'hidden'
			return 0;
		} else {
			cb.style.display = ''
			cb.style.visibility = 'visible'
			return 1;
		}
	}

	function isSwitchedDIV(field) {
		var cb = findObject(field);
		return (cb.style.display == '');
	}

	function SwitchDIVd(field) {
		cb = findObject(field);
		if (cb.style.display == '')
			cb.style.display = 'none'
		else
			cb.style.display = ''
	}

	function SwitchDIVv(field) {
		cb = findObject(field);
		if (cb.style.visibility == 'visible')
			cb.style.visibility = 'hidden'
		else
			cb.style.visibility = 'visible'
	}

	function getCookieVal (offset) { 
		var endstr = document.cookie.indexOf (";", offset); 
		if (endstr == -1) 
			endstr = document.cookie.length; 
		return unescape(document.cookie.substring(offset, endstr)); 
	} 
	function GetCookie (name) { 
		var arg = name + "="; 
		var alen = arg.length; 
		var clen = document.cookie.length; 
		var i = 0; 
		while (i < clen) { 
			var j = i + alen; 
			if (document.cookie.substring(i, j) == arg) 
				return getCookieVal (j); 
			i = document.cookie.indexOf(" ", i) + 1; 
			if (i == 0) break; 
		} 
		return null; 
	} 

	function SetCookie (name, value) { 
		var argv = SetCookie.arguments; 
		var argc = SetCookie.arguments.length; 
		var expires = (argc > 2) ? argv[2] : null; 
		var path = (argc > 3) ? argv[3] : '/'; 
		var domain = (argc > 4) ? argv[4] : null; 
		var secure = (argc > 5) ? argv[5] : false; 
		if (GetCookie (name) != null)
			DeleteCookie (name)
	
		document.cookie = name + "=" + escape (value) + 
		((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
		((path == null) ? "" : ("; path=" + path)) + 
		((domain == null) ? "" : ("; domain=" + domain)) + 
		((secure == true) ? "; secure" : "") + ';'; 
	} 

	function DeleteCookie (name) { 
		var exp = new Date(); 
		exp.setTime (exp.getTime() - 1); 
		// This cookie is history 
		var cval = GetCookie (name); 
		document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString(); 
	}

 //	function SetCookie(cookieName,cookieValue) {
//		document.cookie = cookieName+"="+escape(cookieValue)
//	}
	
	function grayScale(imageIDname) {
		var img = document.getElementById (imageIDname);
		var dp = new RegExp(' Gray', 'gi');
		var p = new RegExp('Gray', 'gi');
		var t = new String(img.style.filter);
		if (t.match(p))
			img.style.filter = t.replace(dp, '');
		else
			img.style.filter += ' Gray';
	}
	
	function flipHorizontally(imageIDname) {
		var img = document.getElementById (imageIDname);
		var p = new RegExp('fliph', 'gi');
		var dp = new RegExp(' fliph', 'gi');
		var t = new String(img.style.filter);
		if (t.match(p))
			img.style.filter = t.replace(dp, '');
		else
			img.style.filter += ' fliph';
	}

	function flipVertically(imageIDname) {
		var img = document.getElementById (imageIDname);
		var dp = new RegExp(' flipv', 'gi');
		var p = new RegExp('flipv', 'gi');
		var t = new String(img.style.filter);
		if (t.match(p))
			img.style.filter = t.replace(dp, '');
		else
			img.style.filter += ' flipv';
		s(img.style.filter) 
	}

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}

/*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
function core_md5(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;

  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);

}

/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t)
{
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
 * Calculate the HMAC-MD5, of a key and some data
 */
function core_hmac_md5(key, data)
{
  var bkey = str2binl(key);
  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md5(opad.concat(hash), 512 + 128);
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function bit_rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Convert a string to an array of little-endian words
 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
function str2binl(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
}

/*
 * Convert an array of little-endian words to a string
 */
function binl2str(bin)
{
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
}

/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(binarray)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}

/*
 * Convert an array of little-endian words to a base-64 string
 */
function binl2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}

	var tabIndexNo = 0
	function setTabIndexFormAllAnElemetns(_doc) {
		if (!_doc) _doc = document
		for (var i=0; i<_doc.childNodes.length; i++) {
			var _child = _doc.childNodes[i]
			if (typeof _child == 'object') {
				if ('tagName' in _child) {
					if ('type' in _child) {
						if (_child.type != 'hidden')
							switch (_child.tagName) {
								case 'INPUT':
								case 'SELECT':
								case 'TEXTAREA':
									_child.tabIndex = tabIndexNo++
								break;
								default:
								break;
						}
					}
				}
				setTabIndexFormAllAnElemetns(_child)
			}
		}
	}
	
	function StartInitializeTabIndex() {
		setTabIndexFormAllAnElemetns()
	}

