Array.prototype.max = function(){
    return Math.max.apply(Math, this);
};

Array.prototype.min = function(){
    return Math.min.apply(Math, this);
};

function trim(str /*,charlist*/) {
	if (!arguments[1])
		return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	else {
		ch = arguments[1].replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');  
		var re = new RegExp('^[' + ch + ']+|[' + ch + ']+$', 'g');  
		return str.replace(re, '');  
	};
}

function focusFirstFormElement(id) {
	var elements = document.getElementById(id).elements;
	if (elements && elements.length)
		elements[0].focus();
}

function setFormElementValue(el) {
	/*
	var parent = $(el).parent().get(1);
	var myinput = $('input', parent).eq(0);
	*/
	myinput = $(el.parentNode.parentNode.getElementsByTagName('input').item(0));
	myinput.val($(el).text());
	myinput.get(0).focus();
	myinput.change();
}

function getFormData(frm) {
	var els = frm.elements;
	var count = els.length;
	var el;
	var data = new Object();
	for (var i = 0; i < count; i++) {
		el = els[i];
		if (el.type.toLowerCase() != 'submit')
			data[el.name] = (el.nodeName.toLowerCase() == 'select') ? getSelectValue(el) : el.value;
	}
	return data;
}

function getUriParts() {
	var u = trim(requestUri(), '/');
	return u.length ? u.split('/') : new Array();
}

function requestUri() {
	var h = location.href;
	var d = document.domain;
	return h.substr(h.indexOf(d) + d.length);
}

/**
 * Used in postDataToUrl()
 */
function getObjectKeysAndValues(data) {
	var keys   = new Array();
	var values = new Array();
	var i = 0;
	for (key in data) {
		keys[i]   = key;
		values[i] = data[key];
		i++;
	}
	return {keys: keys, values: values};
}
/**
 * data = {testName: 'testValue', oneMoreTestName: 'oneMoreTestValue', ...};
 */
function postDataToUrl(url, data) {
	var frm = document.createElement('form');
	frm.action = url;
	frm.method = 'post';
	var data = getObjectKeysAndValues(data);
	var count = data.keys.length;
	var inp;
	for (var i = 0; i < count; i++) {
		inp = document.createElement('input');
		inp.type  = 'hidden';
		inp.name  = data.keys[i];
		inp.value = data.values[i];
		frm.appendChild(inp);
	}
	document.getElementsByTagName('body').item(0).appendChild(frm);
	frm.submit();
	return false;
}

function getTextForNumber(number, txt_1, txt_2) {
	var txt_5 = arguments[3] ? arguments[3] : txt_2;
	var txt;
	number = '' + number;

	var last    = number.substr(-1);
	var twolast = number.substr(-2, 2);
	if (last >= 1 && last <= 4) {
		if (last === '1')
			txt = txt_1;
		else if (twolast >= 11 && twolast <= 14)
			txt = txt_5;
		else
			txt = txt_2;
	}
	else
		txt = txt_5;
	return txt;
}

function validateField(field, opts) {
	if (opts.minlength) {
		if (field.value.length >= opts.minlength && !$(field).hasClass('filled'))
			$(field).addClass('filled');
		if (field.value.length < opts.minlength && $(field).hasClass('filled'))
			$(field).removeClass('filled');
	}
		
}

/* Form validation */
function getLabelForElement(elem) {
	var labels = elem.form.getElementsByTagName('label');
	var labelsLength = labels.length;
	var label;
	for (var i = 0; i < labelsLength; i++) {
		if (labels[i].htmlFor == elem.id) {
			label = labels[i];
			break;
		}
	}
	return label;
}

function isEmpty(str) {
	var re = /^\s*$/;
	var result = str.match(re) ? true : false;
	return result;
}

function isEMailAddr(str) {
	var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	var result = str.match(re) ? true : false;
	return result;
}

function checkForm(frm) {
	var labels = frm.getElementsByTagName('label');
	var labelsLength = labels.length;
	var elements = frm.elements;
	var requiredElements = new Array();
	var requiredElementsTypes = new Array();
	var j = 0;
	for (var i = 0; i < labelsLength; i++) {
		if (labels[i] &&labels[i].lastChild.nodeName.toLowerCase() == 'span' && labels[i].lastChild.firstChild.nodeValue == '*' && document.getElementById(labels[i].htmlFor)) {
			if (labels[i].lastChild.className == 'email') {
				requiredElementsTypes[j] = 'email';
			} else if (labels[i].lastChild.className == 'url') {
				requiredElementsTypes[j] = 'url';
			} else {
				requiredElementsTypes[j] = '';
			}
			requiredElements[j] = document.getElementById(labels[i].htmlFor);
			j++;
		}
	}
	requiredElementsLength = requiredElements.length;
	var elementsEmpty = new Array();
	var elementsWrong = new Array();
	var elementForFocus;
	if (requiredElementsLength) {
		var m = 0;
		var n = 0;
		for (var k = 0; k < requiredElementsLength; k++) {
			if (isEmpty(requiredElements[k].value)) {
				elementsEmpty[m] = requiredElements[k];
				m++;
			} else {
				if (requiredElementsTypes[k] == 'email' && !isEMailAddr(requiredElements[k].value)) {
					elementsWrong[n] = requiredElements[k];
					n++;
				}
			}
		}
		var elementsEmptyLength = elementsEmpty.length;
		var elementsWrongLength = elementsWrong.length;
		var mymsg;
		var mybull = '\u2014 ';
		var mytrailing;
		if (elementsEmptyLength) {
			if (elementsEmptyLength == 1) {
				mymsg = 'Внимание, не заполнено следующее обязательное поле:\n\n';
			} else {
				mymsg = 'Внимание, не заполнены следующие обязательные поля:\n\n';
			}
			for (var p = 0; p < elementsEmptyLength; p++) {
				if (p < elementsEmptyLength - 1) {
					mytrailing = ','
				} else {
					mytrailing = '.'
				}
				mymsg += mybull + trim(getLabelForElement(elementsEmpty[p]).firstChild.nodeValue) + mytrailing + '\n';
			}
			alert(mymsg);
			elementsEmpty[0].focus();
			return false;
		} else if (elementsWrongLength) {
			if (elementsWrongLength == 1) {
				mymsg = 'Внимание, следующее поле заполнено неправильно:\n\n';
			} else {
				mymsg = 'Внимание, следующие поля заполнены неправильно:\n\n';
			}
			for (var p = 0; p < elementsWrongLength; p++) {
				if (p < elementsWrongLength - 1) {
					mytrailing = ','
				} else {
					mytrailing = '.'
				}
				mymsg += mybull + trim(getLabelForElement(elementsWrong[p]).firstChild.nodeValue) + mytrailing + '\n';
			}
			alert(mymsg);
			elementsWrong[0].focus();
			return false;
		}
	}
	return true;
}
/* /Form validation */
