﻿/* 
Common scripts, based on prototype.js

*/


/**
 * Расширения для Prototype
 */

/*
	Дополнительные методы для объекта Element
*/
if (!window.Element)
  var Element = new Object();
  
Element.AdditionalMethods = {
	isChild: function(element, child) {
		element = $(element);
		child = $(child);
		var children = element.getElementsByTagName('*');
		for (var i = 0; i < children.length; i++) {
			if (children[i] == child)
				return true;
			else
				continue;
		}
		return false;
	},
	
	focusFirstAccessibleElement: function(element, focusEditableElement) {
		element = $(element);
		ctrls = element.getElementsByTagName("*");
		for (var i = 0; i < ctrls.length; i++) {
			var ctrl = ctrls[i];
			var focusableElements = (focusEditableElement) ? ['input', 'select', 'textarea'] : ['input', 'select', 'textarea', 'button', 'a'];
			if(focusableElements.include(ctrl.tagName.toLowerCase()) &&
				ctrl.offsetHeight > 0 && !ctrl.disabled) {
				try {
					Field.activate(ctrl);
					return ctrl;
					break;
				}
				catch(e) {}	
			}
		}
		return null;
	},
	
	focusNextAccessibleElement: function(element, container) {
		element = $(element);
		container = $(container);
		var elementFound = false;
		var ctrls = container.getElementsByTagName("*");
		for (var i = 0; i < ctrls.length; i++) {
			var ctrl = ctrls[i];
			if(!elementFound && ctrl != element) continue;
			if(ctrl == element) {
				elementFound = true;
				continue;
			}
			if(['input', 'select', 'textarea', 'button', 'a'].include(ctrl.tagName.toLowerCase()) &&
				ctrl.offsetHeight > 0 && !ctrl.disabled) {
				try { 
					Field.activate(ctrl);
					return ctrl;
				}
				catch(e) {}		
			}
		}
	},
	
	focusPreviousAccessibleElement: function(element, container) {
		element = $(element);
		container = $(container);
		var elementFound = false;
		var ctrls = container.getElementsByTagName("*");
		for (var i = ctrls.length; i > 0; i--) {
			var ctrl = ctrls[i];
			if(!elementFound && ctrl != element) continue;
			if(ctrl == element) {
				elementFound = true;
				continue;
			}
			if(['input', 'select', 'textarea', 'button', 'a'].include(ctrl.tagName.toLowerCase()) &&
				ctrl.offsetHeight > 0 && !ctrl.disabled) {
				try { 
					//Field.activate(ctrl);
					ctrl.focus();
					return ctrl;
				}
				catch(e) {}		
			}
		}
	},
	
	/*
	**  Returns the caret (cursor) position of the specified text field.
	**  Return value range is 0-oField.length.
	*/
	caretPosition: function(element) {
		element = $(element);
		
		// Initialize
		var iCaretPos = 0;

		// IE Support
		if (document.selection) { 

			// Set focus on the element
			element.focus ();

			// To get cursor position, get empty selection range
			var oSel = document.selection.createRange();
			
			if(oSel.text.length > 1) return -1;

			// Move selection start to 0 position
			oSel.moveStart ('character', -element.value.length);

			// The caret position is selection length
			iCaretPos = oSel.text.length;
		}

		// Firefox support
		else if (element.selectionStart || element.selectionStart == '0')
			iCaretPos = element.selectionStart;

		// Return results
		return (iCaretPos);
	},
	
	isDigital: function(element) {
		var value = $(element).value.strip();
		var exp = new RegExp("[0-9]{" + value.length + "}");
		if(!(exp.test(value))) 	{
			return false;
		}
		return true;
	},
	
	validate: function(element, validatingOptions) {
		element = $(element);
		options = {
			isMandatory:			false,  // поле, обязательное для заполнения
			isNumeric:				false,  // цифровое поле
			lengthIsLimited:		false,  // поле с ограниченной длиной
			elementName:            ""      // название поля (лейбл), которое будет использоваться в сообщениях об ошибке
		}
		Object.extend(options, validatingOptions || {});
		
		// объект, в котором определены локализованные строки
		if(parent.L10n) locMessages = parent.L10n.ErrorMessages;
		else if(L10n) locMessages = L10n.ErrorMessages;
		
		if(options.isMandatory) {
			if(element.value.strip() == "") {
				ErrorMessages.errors.push({fieldName: element.name, fieldId: element.id, message: options.elementName, type: "mandatory"});
				return;
			}
		}
		if(options.isNumeric) {
			if(!Element.isDigital(element)) {
				ErrorMessages.errors.push({fieldName: element.name, fieldId: element.id, message: options.elementName + " " + locMessages.MustContainOnlyDigits, type: "incorrect"});
				return;
			}
		}
		if(options.lengthIsLimited) {
			if(element.value.length != element.maxLength) {
				ErrorMessages.errors.push({fieldName: element.name, fieldId: element.id, message: options.elementName + " " + locMessages.MustHaveLength + " " + element.maxLength, type: "incorrect"});
			}
		}
	}
}
Object.extend(Element, Element.AdditionalMethods);

/*
	Дополнительные методы для объекта Form
*/
if (!window.Form)
  var Form = new Object();
  
Form.AdditionalMethods = {
    selects: [],
    
	showLoading: function() {
		if(this.loadingDialog) {
			if(this.loadingDialog.offsetHeight == 0) {
			    this.loadingDialog.style.display = "block";
			    //this.frameDialog.style.display = "block";
			    this.divDialog.style.display = "block";
			}
			else return;
		}
		//window.scrollTo(0,0);
		
		this.forbidActions = this.forbidActions.bindAsEventListener(this);
		if(this.selects.length == 0) this.disableSelects();
		
		if(!this.loadingDialog) 
		{		    
		    // объект, в котором определены локализованные строки
		    if(parent.L10n) locMessages = parent.L10n.Strings;
		    else if(L10n) locMessages = L10n.Strings;
    		
		    docObj = document;
		    if(window.parent) {
			    //alert(window.parent.document.body.outerHTML);
			    docObj = window.parent.document;
			    Event.observe(docObj, "keydown", this.forbidActions);
			    Event.observe(docObj, "click", this.forbidActions);
		    }
		    Event.observe(docObj, "keydown", this.forbidActions);
		    Event.observe(docObj, "click", this.forbidActions);
		    
		    //элементы могли быть созданы раньше
		    var previosLoadingDialog = docObj.all["loadingDialog"];
		    if(previosLoadingDialog)
		    {
		        this.loadingDialog = previosLoadingDialog;			        
		        //this.frameDialog = docObj.all["frameDialog"];
		        this.divDialog = docObj.all["divDialog"];
		        
		        this.loadingDialog.style.display = "block";
			    //this.frameDialog.style.display = "block";
			    this.divDialog.style.display = "block";	    
		    }
		    else
		    {    				
		        this.loadingDialog = docObj.createElement("div");
		        this.loadingDialog.id = "loadingDialog";
		        docObj.body.insertBefore(this.loadingDialog, docObj.body.firstChild);
		        var innerDiv = docObj.createElement("div");
		        innerDiv.style.height = screen.height;
		        innerDiv.style.width = screen.width;
		        this.loadingDialog.appendChild(innerDiv);
		        //this.frameDialog = docObj.createElement("iframe");
		        //this.frameDialog.id = "frameDialog";
		        //docObj.body.insertBefore(this.frameDialog, docObj.body.firstChild);
		        this.divDialog = docObj.createElement("div");
		        this.divDialog.id = "divDialog";
		        docObj.body.insertBefore(this.divDialog, docObj.body.firstChild);
		        var imgHourglass = docObj.createElement("span");
		        imgHourglass.className = "hourglass";
		        this.divDialog.appendChild(imgHourglass);
		        var pWait = docObj.createElement("p");
		        pWait.className = "wait";
		        pWait.innerHTML = locMessages.PleaseWait; //"Пожалуйста, подождите";
		        this.divDialog.appendChild(pWait);
		        var pLoading = docObj.createElement("p");
		        pLoading.className = "loading";
		        pLoading.innerHTML = locMessages.DataLoadingInProgress; //"Идёт загрузка данных: ";
		        this.divDialog.appendChild(pLoading);
		        var spanProgressbar = docObj.createElement("span");
		        spanProgressbar.className = "progressbar";
		        this.divDialog.appendChild(spanProgressbar);
		    }
		}
		
		/*this.activeElement = document.activeElement;
		this.activeElement.blur();*/
	},
	
	hideLoading: function() {
		if(!this.loadingDialog || this.loadingDialog.offsetHeight == 0) return;
		
		this.loadingDialog.style.display = "none";
		//this.frameDialog.style.display = "none";
		this.divDialog.style.display = "none";
		/*Element.remove(this.loadingDialog);
		Element.remove(this.frameDialog);
		Element.remove(this.divDialog);*/

		if(window.parent) {
			Event.stopObserving(window.parent.document, "keydown", this.forbidActions);
			Event.stopObserving(window.parent.document, "click", this.forbidActions);
		}
		Event.stopObserving(document, "keydown", this.forbidActions);
		Event.stopObserving(document, "click", this.forbidActions);
		//приходится использовать setTimeout, потому что иначе визуально слой убирается после того, 
		//как снимается задизабленность селектов, и селекты вылезают над слоем
		if(this.selects.length > 0) setTimeout((function() { this.enableSelects(); }).bind(this), 10);
		/*try {
			this.activeElement.select();
			this.activeElement.focus();
		} catch(e) {}*/
	},
	
	forbidActions: function(e) {
		return false;
	},
	
	disableSelects: function() {
	    var frames = window.top.frames;
	    for(var i=0; i<frames.length; i++) {
	        try
	        {
	            if(frames[i].document && frames[i].document.body && frames[i].document.body.offsetHeight > 0) {
	                var selects = frames[i].document.getElementsByTagName("select");
	                for(var j=0; j<selects.length; j++) {
	                  this.selects.push({select: selects[j], disabled: selects[j].disabled});
	                  selects[j].disabled = true;
	                }
	            }
	        }
	        catch (e)
	        {
	        }
	    }
	},
	
	enableSelects: function() {
	    if(this.loadingDialog.offsetHeight > 0) return;
	    var frames = window.top.frames;
	    for(var i=0; i<frames.length; i++) {
	        if(frames[i].document.body && frames[i].document.body.offsetHeight > 0) {
	            var selects = frames[i].document.getElementsByTagName("select");
	            for(var j=0; j<selects.length; j++) {
	                for(var k=0; k<this.selects.length; k++) {
	                    if(this.selects[k].select == selects[j]) {
	                        selects[j].disabled = this.selects[k].disabled;
	                        break;
	                    }
	                }
	            }
	        }
	    }
	    this.selects.length = 0;
	},
	
	openModalDialog: function(url, arguments, features) {
	    this.showLoading();
	    var returnValue = window.showModalDialog(url, arguments, features);
	    this.hideLoading();
	    return returnValue;
	},
	
	getErrorMessage: function(msg) {
	    if(typeof(msg) == "object") { msg = msg.Message; }
	    return msg;
	},
	
	getHTMLError: function(msg) {
		if(msg != null && typeof(msg) == "object") { msg = msg.Message; }
		var errorHTML = '<p class="warning" style="display: block;">' + msg + '</p>';
		return errorHTML;
	},
	
	getHTMLInfoMessage: function(msg) {
		if(msg != null && typeof(msg) == "object") { msg = msg.Message; }
		var infoHTML = '<p class="info" style="display: block;">' + msg + '</p>';
		return infoHTML;
	}
}
Object.extend(Form, Form.AdditionalMethods);

/*
	Дополнительные свойства и переопределение методов для объекта Event
*/
Object.extend(Event, {
  KEY_PAGEUP:       33,
  KEY_PAGEDOWN:     34,
  KEY_HOME:         36,
  KEY_END:          35,
  KEY_SHIFT:        16,
  KEY_CTRL:         17,

  //"нормализация" события
  /*event: function(event){
    return !event && window.event ? window.event : event;
  },*/
  
  //Подпорка для ошибки внутри prototype.js - в ней меняется перехват keypress на keydown. Из-за этого в IE не обрабатываются набранные символы (~charCode) внутри onkeypress
  observe: function(element, name, observer, useCapture) {
    var element = $(element);
    useCapture = useCapture || false;
    this._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    var element = $(element);
    if (element == null) {
        return;
    }
    useCapture = useCapture || false;
    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      element.detachEvent('on' + name, observer);
    }
  }
}); 

/*
	Задание некоторых свойств объекта AjaxPro
*/
if(window.AjaxPro) { 
    //Обработка события AjaxPro.onLoading
    AjaxPro.onLoading = function(b) {
        if(b) {
            Form.showLoading();
        } else {
            Form.hideLoading();
        }
    }
    
    //AjaxPro.timeoutPeriod
    AjaxPro.timeoutPeriod = 180*1000;
}   

/*

*/
if (!window.ErrorMessages)
  var ErrorMessages = new Object();
  
ErrorMessages.Methods = {
	errors: [],
	
	init: function() {
		this.errors = [];
	},
	
	show: function(errorMessagesContainer, validatingFieldsContainer, focusFirstErrorField, selectErrorFields) {
		errorMessagesContainer = $(errorMessagesContainer);			// контейнер для вывода ошибок
		validatingFieldsContainer = $(validatingFieldsContainer);	// контейнер проверяемых элементов
		var mandatoryFields = "";
		var incorrectFields = "";
		var errorMessages = "";
		var isFocused = false;
		
		// объект, в котором определены локализованные строки
		if(parent.L10n) locMessages = parent.L10n.ErrorMessages;
		else if(L10n) locMessages = L10n.ErrorMessages;
		
		this.errors.each(function(error) {
			// если надо выделить невалидный элемент, присваиваем соответствующий класс, элементам с абтрибутом name=error.fieldName
			if(selectErrorFields) {
				$A(cssQuery("[name=\"" + error.fieldName + "\"]", validatingFieldsContainer)).each(function(element) {
					Element.addClassName(element, "error");
				});
			}
			
			switch (error.type) {
				case "mandatory":	mandatoryFields += error.message + ", "; break;
				case "incorrect":	incorrectFields += error.message + ", "; break;
				case "common":		errorMessages += error.message + ", "; break;
			}
		});
		mandatoryFields = mandatoryFields.replace(/,\s+$/, '');
		incorrectFields = incorrectFields.replace(/,\s+$/, '');
		errorMessages = errorMessages.replace(/,\s+$/, '');
		if(mandatoryFields.strip() != "") {
			mandatoryFields = "<b>" + locMessages.NotFilledMandatoryFields + ": </b>" + mandatoryFields; //"<b>" + RequiredFieldValidator + "</b>" + mandatoryFields;
		}
		if(incorrectFields.strip() != "") {
			incorrectFields = "<b>" + locMessages.IncorrectFilledFields + ": </b>" + incorrectFields; //"<b>" + RegularExpressionValidator + "</b>" + incorrectFields;
		}
		errorMessagesContainer.innerHTML = ((mandatoryFields.strip() + "<br><br>" + incorrectFields.strip()).replace(/(^\<br><br>)+|(\<br><br>+$)/,"") + "<br><br>" + errorMessages.strip()).replace(/(^\<br><br>+)|(\<br><br>+$)/,"");
		if(errorMessagesContainer.innerHTML.strip() != "") {
			errorMessagesContainer.style.display = "block";
			if(focusFirstErrorField) {
				errorMessagesContainer.innerHTML += "<br/><br/>";
				this.linkToFirstErrorField = document.createElement("a");
				this.linkToFirstErrorField.href = "#";
				//this.linkToFirstErrorField.className = "errorHref";
				this.linkToFirstErrorField.innerHTML = locMessages.CorrectMistakes;
				errorMessagesContainer.appendChild(this.linkToFirstErrorField);
				Event.observe(this.linkToFirstErrorField, "click", this.focusFirstErrorField.bind(this), false);
				try {
					this.linkToFirstErrorField.focus();
				}
				catch(e) {}
			}
			window.scrollTo(0,0);
		}
	},
	
	hide: function(errorMessagesContainer, validatingFieldsContainer, unselectErrorFields) {
		errorMessagesContainer = $(errorMessagesContainer);
		validatingFieldsContainer = $(validatingFieldsContainer);
		if(errorMessagesContainer.style.display == "none"){
			this.errors = [];
			return;
		}
		
		this.errors.each(function(error) {
			if(unselectErrorFields) {
				$A(cssQuery("[name=\"" + error.fieldName + "\"]", validatingFieldsContainer)).each(function(element) {
					Element.removeClassName(element, "error");
				});
			}
			
			errorMessagesContainer.style.display = "none";
			errorMessagesContainer.innerHTML = "";
		});	
		this.errors = [];	
	},
	
	focusFirstErrorField: function(event) {
		for (var i = 0; i < this.errors.length; i++) {
			error = this.errors[i];
			try	{ 
				Field.activate($(error.fieldId));
				return;
			} catch(e) {}			
		}
	}
}

Object.extend(ErrorMessages, ErrorMessages.Methods);

var NumericField = Class.create();
NumericField.prototype = {
	initialize: function(element) {
		this.element = $(element);
		
		this.eventKeypress  = this.keyPress.bindAsEventListener(this);
		this.eventPaste  = this.paste.bindAsEventListener(this);
		
		Event.observe(this.element, "keypress", this.eventKeypress);
		Event.observe(this.element, "paste", this.eventPaste);
	},
	
	keyPress: function(event) {
		if (event.keyCode < 48 || event.keyCode > 57) Event.stop(event);
	},
	
	paste: function(event) {
		var clipboardDataText = window.clipboardData.getData("Text");
		var exp = new RegExp("[0-9]{"+clipboardDataText.length+"}");
		if(!(exp.test(clipboardDataText))) Event.stop(event);
	}
  
}

function stripeTable(withoutHighlight) {
    var tables = cssQuery("table.striped");
    for(var i = 0, l = tables.length; i < l; i++) {
        var trs = tables[i].getElementsByTagName("tr");
        for(var n = 0, m = trs.length; n < m; n++) {
			if(n/2 - Math.round(n/2) == 0) Element.addClassName(trs[n], "even");
			else Element.addClassName(trs[n], "odd");
			if(withoutHighlight) continue;
			Event.observe(trs[n], "mouseover", (function() { Element.addClassName(this, "selected"); }).bind(trs[n]));
			Event.observe(trs[n], "mouseleave", (function() { Element.removeClassName(this, "selected"); }).bind(trs[n]));
        }			
    }
}

//функция явного преобразования в строку
function TS(obj) 
{
	var r = (obj) ? obj.toString() : "";
	return r;
}

if (!window.CookieManager)
{
	var CookieManager=
	{
		//возвращает объект со свойством value.
		getCookie:function(nameCookie)
		{
			if (document.cookie.length>0)
			{
				var i_start=document.cookie.indexOf(nameCookie + "=");
				if (i_start!=-1)
				{ 
					i_start=i_start + nameCookie.length + 1; 
					var i_end=document.cookie.indexOf(";",i_start);
					if (i_end==-1) 
						i_end=document.cookie.length;
					
					var obj={};
					obj.value=unescape(document.cookie.substring(i_start,i_end));	
					return obj;
				}
				else
				  return null;
			}
			else
				return null;
		}
	};
} //end of (!window.CookieManager)