Array.prototype.push = function(newElement) {
	this[this.length] = newElement;
}

Array.prototype.copy = function() {
	var copyOfArray = Array();
	for (key in this) {
		copyOfArray[key] = this[key];
	}
	return copyOfArray;
}
//
//Array.prototype.indexOf = function(object) {
//	for (index in this) {
//		if (this[index] === object) {
//			return index;
//		}
//	}
//	return false;
//}






CRDate = {
	
	monthNames:Array(
		Array('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'),
		Array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря')
	),
	
	
	getMonthName:function(monthNumber, format) {
		monthNumber = Number(monthNumber);
		if (monthNumber < 0 || monthNumber > 11) return '';
		if (format == 0 || format == 1) {
			return this.monthNames[format][monthNumber];
		}
		return '';
	}
	
	
}















CREvent = {
	eventTypeClick:{name:'click'},
	eventTypeDoubleClick:{name:'dblclick'},
	eventTypeMouseDown:{name:'mousedown'},
	eventTypeMouseUp:{name:'mouseup'},
	eventTypeMouseOver:{name:'mouseover'},
	eventTypeMouseOut:{name:'mouseout'},
	eventTypeLoad:{name:'load'},
	
	eventTypeDragStart:{name:'dragstart'},
	eventTypeDragEnd:{name:'dragend'},
	eventTypeSelectStart:{name:'selectstart'},
	
	eventTypeResize:{name:'resize'},
	
	eventTypeSubmit:{name:'submit'},
	eventTypeKeyDown:{name:'keydown'},
	eventTypeKeyPress:{name:'keypress'},
	
	
	setObserving:function(observingObject, eventType, invokingFunction) {
		if (observingObject.addEventListener) {
			observingObject.addEventListener(eventType.name, invokingFunction, false);
		} else if (observingObject.attachEvent) {
			observingObject.attachEvent('on' + eventType.name, invokingFunction);
		}
	},
	
	
	removeObserving:function(observingObject, eventType, invokingFunction) {
		if (observingObject.removeEventListener) {
			observingObject.removeEventListener(eventType.name, invokingFunction, false);
		} else if (observingObject.detachEvent) {
			observingObject.detachEvent('on' + eventType.name, invokingFunction);
		}
	},
	
	
	preventDefaultBehavior:function(currentEvent) {
		currentEvent = currentEvent || window.event;
		if (!currentEvent) return;
		currentEvent.cancelBubble = true;
		currentEvent.returnValue = false;
		if (currentEvent.stopPropagation) {
			currentEvent.stopPropagation();
		}
		if (currentEvent.preventDefault) {
			currentEvent.preventDefault();
		}
	}
}




















































MLElements = {
	setClassForElement:function(element, newClassName) {
		if (!this.isClassNameAcceptableForNode(newClassName, element)) {
			element.className += ' ' + newClassName;
		}
	},
	
	
	unsetClassForElement:function(element, className) {
		var classNameFound = false;
		var classNamePosition = -1;
		do {
			classNameFound = false;
			if (element.className == className) {
				element.className = '';
			} else if (element.className.indexOf(' ' + className) == element.className.length - className.length - 1) {
				element.className = element.className.substr(0, element.className.length - className.length - 1);
			} else if ((classNamePosition = element.className.indexOf(' ' + className + ' ')) != -1) {
				element.className = element.className.substr(0, classNamePosition) + element.className.substr(classNamePosition + className.length + 1);
				classNameFound = true;
			} else if (element.className.indexOf(className + ' ') == 0) {
				element.className = element.className.substr(className.length + 1);
				classNameFound = true;
			}
		} while (classNameFound);
	},
	
	
	findElementsOfTypeWithClassName:function(type, className, containerElement) {
		containerElement = containerElement || document;
		var elements = containerElement.getElementsByTagName(type);
		
		var foundElements = Array();
		for (var i=0; i<elements.length; i++) {
			if (this.isClassNameConformsToSubset(className, elements[i].className)) {
				foundElements.push(elements[i]);
			}
		}
		return foundElements;
	},
	
//	findElementsWithClassName:function(className) {
//		var elements = document.getElementsByTagName('*');
//		var foundElements = Array();
//		for (var i=0; i<elements.length; i++) {
//			if (elements[i].className == className) {
//				foundElements.push(elements[i]);
//			}
//		}
//		return foundElements;
//	},
	
	
	findElementsWithBaseID:function(baseID, container) {
		var elements = Array();
		
		if (!container) {
			container = document;
		}
		
		if (container.all) {
			elements = container.all;
		} else {
			elements = container.getElementsByTagName('*');
		}
		var foundElements = Array();
		var testExpression = new RegExp('^'+baseID+'(_[0-9]+)?$');
		for (var i=0; i<elements.length; i++) {
			if (elements[i].id && testExpression.test(elements[i].id)) {
				foundElements.push(elements[i]);
			}
		}
		return foundElements;
	},
	
	
//	findElementsWithBaseID:function(baseID) {
//		var elements = Array();
//		if (document.all) {
//			elements = document.all;
//		} else {
//			elements = document.getElementsByTagName('*');
//		}
//		var foundElements = Array();
//		var testExpression = new RegExp('^'+baseID+'(_[0-9]+)?$');
//		for (var i=0; i<elements.length; i++) {
//			if (elements[i].id && testExpression.test(elements[i].id)) {
//				foundElements.push(elements[i]);
//			}
//		}
//		return foundElements;
//	},
	
	
	findFirstChildNodeWithClassName:function(containerNode, nodeClassName) {
		if (containerNode.nodeType == 1) {
			for (var i=0; i<containerNode.childNodes.length; i++) {
				if (containerNode.childNodes[i].nodeType == 1 && this.isClassNameConformsToSubset(nodeClassName, containerNode.childNodes[i].className)) {
					return containerNode.childNodes[i];
				}
			}
		}
		return null;
	},
	
	
	findChildNodesWithClassName:function(containerNode, nodeClassName) {
		if (containerNode.nodeType == 1) {
			var foundChildNodes = Array();
			for (var i=0; i<containerNode.childNodes.length; i++) {
				if (containerNode.childNodes[i].nodeType == 1 && this.isClassNameConformsToSubset(nodeClassName, containerNode.childNodes[i].className)) {
					foundChildNodes.push(containerNode.childNodes[i]);
				}
			}
			if (foundChildNodes.length) {
				return foundChildNodes;
			}
		}
		return null;
	},
	
	
	isClassNameConformsToSubset:function(className, subset) {
		return subset && className && (subset == className || subset.indexOf(' ' + className + ' ') != -1 || subset.indexOf(className + ' ') === 0 || ((subset.indexOf(' ' + className) == subset.length - className.length - 1) && subset.length - className.length - 1 > 0));
	},
	
	
	isClassNameAcceptableForNode:function(className, node) {
		return (node.nodeType == 1 && this.isClassNameConformsToSubset(className, node.className));
	}
	
}


















































CRMD5 = {
	hash:function(sourceString) {
		var binaryArray = Array();
		for (var i=0; i<sourceString.length*8; i+=8) {
			binaryArray[i>>5] |= (sourceString.charCodeAt(i/8) & 0xFF) << (i % 32);
		}
		
		var binaryArrayLength = sourceString.length * 8;
		binaryArray[binaryArrayLength >> 5] |= 0x80 << ((binaryArrayLength) % 32);
		binaryArray[(((binaryArrayLength + 64) >>> 9) << 4) + 14] = binaryArrayLength;
		
		var parts = Array();
		var hashArray = Array(0x67452301, 0xEFCDAB89 & 0xFFFFFFFF);
		hashArray[2] = ~hashArray[0];
		hashArray[3] = ~hashArray[1];
		
		var indices = Array(Array(0, 1, 5, 0), Array(0, 4, 2, 6));
		var combinationIntegers = Array(~0x28955b87, ~0x173848a9, 0x242070db, ~0x3e423111, ~0xa83f050, 0x4787c62a, ~0x57cfb9ec, ~0x2b96afe, 0x698098d8, ~0x74bb0850, ~0xa44e, ~0x76a32841, 0x6b901122, ~0x2678e6c, ~0x5986bc71, 0x49b40821, ~0x9e1da9d, ~0x3fbf4cbf, 0x265e5a51, ~0x16493855, ~0x29d0efa2, 0x2441453, ~0x275e197e, ~0x182c0437, 0x21e1cde6, ~0x3cc8f829, ~0xb2af278, 0x455a14ed, ~0x561c16fa, ~0x3105c07, 0x676f02d9, ~0x72d5b375, ~0x5c6bd, ~0x788e097e, 0x6d9d6122, ~0x21ac7f3, ~0x5b4115bb, 0x4bdecfa9, ~0x944b49f, ~0x4140438f, 0x289b7ec6, ~0x155ed805, ~0x2b10cf7a, 0x4881d05, ~0x262b2fc6, ~0x1924661a, 0x1fa27cf8, ~0x3b53a99a, ~0xbd6ddbb, 0x432aff97, ~0x546bdc58, ~0x36c5fc6, 0x655b59c3, ~0x70f3336d, ~0x100b82, ~0x7a7ba22e, 0x6fa87e4f, ~0x1d3191f, ~0x5cfebceb, 0x4e0811a1, ~0x8ac817d, ~0x42c50dca, 0x2ad7d2bb, ~0x14792c6e);
		var dataForCombination = Array();
		
		var partsIndex = 0;
		var charNumber = 0;
		var quoterIndex = 0;
		var quoterModulo = 0;
		var bitsRotateCount = 0;
		
		for (var i=0; i<binaryArray.length; i+=16) {
			parts = hashArray.copy();
			for (var j=0; j<64; j++) {
				quoterIndex = Math.floor(j / 16);
				quoterModulo = j % 4;
				charNumber = ((j + indices[0][quoterIndex] + (j * indices[1][quoterIndex])) % 16);
				partsIndex = (64 + (j * -1)) % 4;
				
				if (j < 16) {
					bitsRotateCount = 2 + (5 * ((quoterModulo) + 1));
				} else if (j < 32 || j >= 48) {
					bitsRotateCount = 4 + Number(j >= 48) + (4 * (quoterModulo)) + Math.pow(Math.ceil(((quoterModulo) + 1) / 2), Math.floor(((quoterModulo) + 1) / 2));
				} else {
					bitsRotateCount = 4 + (((j - 32) % 2) * 7) + (Math.floor(((j - 32) % 4) / 2) * 12);
				}
				hashArray[partsIndex] = this.combine(hashArray[(partsIndex + 2) % 4], hashArray[(partsIndex + 1) % 4], hashArray[partsIndex], hashArray[(partsIndex + 3) % 4], binaryArray[i + charNumber], bitsRotateCount, combinationIntegers[j], quoterIndex);
			}
			for (var j=0; j<4; j++) {
				hashArray[j] = this.bitwiseAdd(hashArray[j], parts[j]);
			}
		}
		var hexPattern = '0123456789abcdef';
		var hexString = '';
		for (var i=0; i<hashArray.length*4; i++) {
			hexString += hexPattern.charAt((hashArray[i>>2] >> ((i % 4) * 8 + 4)) & 0xF) + hexPattern.charAt((hashArray[i>>2] >> ((i % 4) * 8)) & 0xF);
		}
		return hexString;
	},
	
	
	combine:function(int0, int1, int2, int3, int4, int5, int6, combinationType) {
		if (combinationType == 0) {
			int0 = (int1 & int0) | ((~int1) & int3);
		} else if (combinationType == 1) {
			int0 = (int3 & int1) | ((~int3) & int0);
		} else if (combinationType == 2) {
			int0 = int1 ^ int0 ^ int3;
		} else {
			int0 = int0 ^ (int1 | (~int3));
		}
		return this.bitwiseAdd(this.bitwiseRotateLeft(this.bitwiseAdd(this.bitwiseAdd(int0, int2), this.bitwiseAdd(int4, int6)), int5), int1);
	},
	
	
	bitwiseRotateLeft:function(number, bitsCount) {
		return (number << bitsCount) | (number >>> (32 - bitsCount));
	},
	
	
	bitwiseAdd:function(number1, number2) {
	  var lowestBitsSum = (number1 & 0xFFFF) + (number2 & 0xFFFF);
	  var loweredHighestBitsSum = (number1 >> 16) + (number2 >> 16) + (lowestBitsSum >> 16);
	  return (loweredHighestBitsSum << 16) | (lowestBitsSum & 0xFFFF);
	}
}






