YUI.add('_utils', function(Y) {
 
    Y.namespace('my.utils');
	var _utils = Y.my.utils;
	
	
	_utils.minWidth = function()
	{ 
		var body = Y.one('body'), html = Y.one('html');
		body.setStyle('width',(html.get('offsetWidth') < 990) ? '990px' : '100%');
		Y.on('resize',_utils.minWidth,window);
	}
	
	_utils.loadingPanel = function(setup)
	{
		var id = setup['id'], panel = document.createElement('div');
		this.delay = setup['delay'] ? setup['delay'] : 500;
		this.setup = {};
		this.setup.styles = {padding:'5px 10px', color:'#fff',background:'#00c','textAlign':'center'};
		this.message = 'loading...';
		panel.id = id;
		Y.one('body').appendChild(panel);
		panel =  Y.one('#'+id);
		panel.setStyles({'position':'absolute','display':'none'});
		for (var key in setup.styles){	panel.setStyle(key, setup.styles[key]); }
		for (var key in this.setup.styles){ if(!setup.styles.hasOwnProperty(key)) panel.setStyle(key, this.setup.styles[key]);}
		this.panel = panel;
	}
	
	_utils.loadingPanel.prototype = 
	{
		show : function(message)
		{
			var message = message ? message : this.message;
			this.panel.set('innerHTML',message);
			this.panel.setStyle('visibility','hidden');
			this.panel.setStyle('display','');
			this.center();
			this.panel.setStyle('visibility','visible');
		},
		hide : function(message)
		{
			var obj = this, message = message ? message : this.message;
			this.panel.set('innerHTML',message);
			setTimeout(function(){obj.panel.setStyle('display','none')}, obj.delay);
		},
		center : function()
		{
			var left = Math.round((Y.DOM.docWidth() - this.panel.get('offsetWidth'))/2) + 'px',
				top = Y.DOM.docScrollY() + 'px';
			this.panel.setStyle('left',left);
			this.panel.setStyle('top',top);
		}
	}
	
	_utils.fixPNG = function(nodes)
	{
		if(nodes)
		{
			nodes.each
			(
				function()
				{
					var src = this.getAttribute('src');
					this.set('src', '/i/blank.gif');
					this.set('filter','progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\',sizingMethod=\'scale\')');
				}
			)
		}
	}
	
	_utils.messageArray = new Array();

	_utils.setMessage = function(nspace, key, message)
	{	
		if(typeof(_utils.messageArray[nspace]) == 'undefined') _utils.messageArray[nspace] = new Array();
		_utils.messageArray[nspace][key] = message;
	}
	
	_utils.getMessage = function(nspace,key)
	{	
		return _utils.messageArray[nspace][key];
	}
	
	_utils.stringToArray = function(sourceString)
	{
		var array = sourceString.split('i:'),
			result = new Array();
		for( var i = 1, length = array.length; i < length; i++)
		{
			var tmpArr = array[i].split('"'),
				index = parseInt(array[i].substr(0,1)),
				j = 0;	
			if( typeof(result[index]) == 'undefined') result[index] = new Object();
			while(j < tmpArr.length)
			{ 
				if(!/[\:\;\}\{\,]/.test(tmpArr[j]))
				{	
					result[index][tmpArr[j]] = tmpArr[j+2];
					j += 3;
				}
				else j++;
			}
		}
		
		return result;
	}
	
	_utils.getXMLcontent = function(o)
	{
		var xml = (o.responseXML && o.responseXML.documentElement) ? o.responseXML : false, dataObject = {};
		if(xml)
		{
			if(xml.hasChildNodes())
			{
				var response = xml.getElementsByTagName('response')[0];
				for(var n = response.firstChild; n; n = n.nextSibling)
				{
					if(n.nodeType == 1)	dataObject[n.tagName] = (n.hasChildNodes()) ? n.firstChild.nodeValue : '';
				}
				return dataObject;
			}
			else alert('_utils.getXMLcontent — no tags responsed!');
		}
		else alert('_utils.getXMLcontent — no xml returned!');
	}
	
	_utils.ajaxQuery = function (setup,e)// setup = { query:'', successHandler : fn, errorHandler : fn, form : 'formId', fileUpload : true/false,  args : { some args }}
	{
		if(e) e.halt();
		var request,
			query = setup['query'],
			successHandler = setup['successHandler'] ? setup['successHandler'] : false,
			errorHandler = setup['errorHandler'] ? setup['errorHandler'] : false,
			form = setup['form'] ? setup['form'] : false,
			fileUpload = setup['fileUpload'] ? setup['fileUpload'] : false,
			cfg = {	method: 'POST', on: { success: onSuccess, failure: onFailure }};
		
		if(form) cfg.form = {id : form, useDisabled : false, upload : fileUpload};
			
		function onSuccess(id,o)
		{
			if(o.responseText)
			{
				var result = _utils.getXMLcontent(o);
				if(result['error'])
				{
					if(errorHandler) errorHandler(result);
					else alert(result['error']);
				}
				else if(successHandler) successHandler(result);
				else alert(result);
			}
			else if(!o && successHandler) successHandler();
			else alert(o.responseText);
		}
		
		function onFailure(id,o){ _utils.defaultErrorHandler(o); }
		Y.io(query, cfg);
	}
	
	_utils.defaultErrorHandler = function(o){ if(o) alert('Transaction Failed — '+o.statusText); else alert('Transaction Failed'); }
	
	_utils.hasAttribute = function(el,name){ return el.getAttribute(name) != null; }
	
	_utils.callForm = function(args) //form class constructor args = {form:'id'}
	{
		for(var key in args) { this[key] = args[key] }
		this.errorEls = [];//error fileds array
		this.emailFields = [];//email fields
		this.form = (typeof(args['form']) == 'object') ? args['form'] : (typeof(args['form']) == 'string') ? Y.Node.getDOMNode(Y.one('#'+args['form'])) : false;
		this.fieldsArray = [];//array of els who need to check (have attribute re)
		this.updateFields();
		if(!this.fieldsArray.length){ alert('no fields for check'); }
		else this.checkForm();
	}
	
	_utils.callForm.prototype =
	{
		updateFields :function()
		{
			var obj = this, els = this.form.getElementsByTagName('*');
			for(var i = 0, len = els.length; i < len; i++)
			{
				if(_utils.hasAttribute(els[i],'re'))
				{
					this.fieldsArray.push(els[i]);
					Y.on('keyup', function(){obj.checkForm()}, els[i], {el:els[i]});//set listener for field
					Y.on('blur', function(){obj.checkForm()}, els[i], {el:els[i]});
				}
				if(_utils.hasAttribute(els[i],'name') && /email/.test(els[i].getAttribute('name')))//find email fields and set global object property [emailFields]
				{
					this.emailFields.push(els[i]);
				}
			}
		},
		getFormErrors : function()//return array of error els and set global object property [errorEls]
		{
			this.errorEls = [];
			for(var i = 0, l = this.fieldsArray.length; i < l; i++)
			{
				if(this.isFieldError(this.fieldsArray[i])) this.errorEls.push(this.fieldsArray[i]);
			}
			return this.errorEls;
		},
		isFieldError : function(el)//check one field on error
		{
			if(el)
			{
				if(_utils.hasAttribute(el,'re'))
				{
					var re = new RegExp(el.getAttribute('re'));
					return !re.test(el.value)
				}
			}
			else alert('el undefined')
		},
		checkForm : function()//toggle enable-disable form submit
		{
			this.getFormErrors();
			if(!this.errorEls.length) this.enableForm();
			else this.disableForm();
		},
		enableForm : function()
		{
			var els = this.form.getElementsByTagName('*');
			for(var i = 0, len = els.length; i < len; i++)
			{
				if(_utils.hasAttribute(els[i],'type') && els[i].getAttribute('type').toLowerCase() == 'submit')
				{
					this.submitButton = els[i];//submit button
					this.submitButton.disabled = false;
				}
			}
		},
		disableForm : function()
		{
			var els = this.form.getElementsByTagName('*');
			for(var i = 0, len = els.length; i < len; i++)
			{
				if(_utils.hasAttribute(els[i],'type') && els[i].getAttribute('type').toLowerCase() == 'submit')
				{
					this.submitButton = els[i];//submit button
					this.submitButton.disabled = true;
				}
			}
		},
		sendForm : function(setup,e)// setup = { query:'', successHandler : fn, errorHandler : fn, formId : 'formId', fileUpload : true/false,  args : { some args }}
		{
			if(e) e.halt();
			
			var setup = (setup && e) ? setup : this.setup,
				query = setup['query'],
				successHandler = setup['successHandler'] ? setup['successHandler'] : false,
				errorHandler = setup['errorHandler'] ? setup['errorHandler'] : false,
				formId = setup['formId'] ? setup['formId'] : false,
				fileUpload = setup['fileUpload'] ? setup['fileUpload'] : false,
				cfg = {	method : 'POST', on : { complete: completeHandler, failure: failureHandler }};
			
			if(formId) cfg.form = {id : formId, useDisabled : false, upload : fileUpload};
			
			function completeHandler(id,o)
			{
				if(o.responseText)
				{
					var result = _utils.getXMLcontent(o);
					if(result['error'])
					{
						if(errorHandler) errorHandler(result);
						else alert(result['error']);
					}
					else if(successHandler) successHandler(result);
					else alert(result);
				}
				else if(!o && successHandler) successHandler();
				else alert(o.responseText);
			}
			
			function failureHandler(id,o) { if(o) alert('Transaction Failed — '+o.statusText); else alert('Transaction Failed'); }
			
			Y.io(query, cfg);
		}
	}
	
	_utils.elsCloner = function(args)
	{
		this.original = Y.one('#'+args.original);
		this.originalClassName = this.original.get('className');
		this.containerID = args.containerID;
		this.container = Y.one('#'+args.containerID);
		this.cloneButtonClass = args.cloneButtonClass;
		this.removeButtonClass = args.removeButtonClass;
		this.max = args.max;
	}


	_utils.elsCloner.prototype = {
		
		checkState : function()
		{
			var obj = this,
				els = Y.all('.'+this.originalClassName),
				cloneButtons = Y.all('.'+this.cloneButtonClass),
				removeButtons = Y.all('.'+this.removeButtonClass);
			
			els = Y.NodeList.getDOMNodes(els);
			removeButtons.each
			(
				function()
				{ 
					var el = this;
					obj.enableRemoveButton(el);
					if(!this.attached) this.attached = Y.on('click', function(){ obj.removeElement(el)}, el);//check for once event attachment
				}
			);
			cloneButtons.each(function(){ obj.enableCloneButton(this); });

			if(this.max !== false && els.length == this.max)
			{
				cloneButtons.each(function(){ obj.disableCloneButton(this) })
			}
			
			if(els.length == this.min)
			{
				removeButtons.each(function(){ obj.disableRemoveButton(this) })
			}		
		},
		

		enableClone:function(clone)
		{
			clone.removeAttribute('id');
			clone.setStyle('display','');
			//активируем все элементы формы в блоке
			var els = clone.getElementsByTagName('input');
			els.each(function(){this.set('disabled',false);});
			
			els = clone.getElementsByTagName('select');
			els.each(function(){this.set('disabled',false);});
			
			els = clone.getElementsByTagName('textarea');
			els.each(function(){this.set('disabled',false);});
		},
		
		cloneElement:function()
		{
			var clone = this.original.cloneNode(true);
			this.enableClone(clone);
			this.container.appendChild(clone);
			this.checkState();
		},
		
		calculateParentElement:function(el)
		{
			if(el.get('className') != this.originalClassName) el = this.calculateParentElement(el.get('parentNode'));
			return el;	
		},
		
		removeElement:function(removeButton)
		{	
			var item = this.calculateParentElement(removeButton);
			this.container.removeChild(item);
			this.checkState();
		},
		
		enableCloneButton : function (obj)
		{
			obj.setStyle('display','');
		},
		
		disableCloneButton : function (obj)
		{
			obj.setStyle('display','none');
		},
		
		enableRemoveButton : function (obj)
		{
			obj.setStyle('display','');
		},
		
		disableRemoveButton : function (obj)
		{
			obj.setStyle('display','none');
		}
	}
	
	//----------------------------------------------------------------------------end


	//функция заменяет символы в строке на заданные значения, аналог strtr в php
	_utils.phpStrtr = function(str,list)
	{
		for( var c in list ){ str = String(str).replace( new RegExp( c ,"g"), list[c] )}
		return str
	}




	//функция переводит русский текст в транслит, а главное она работает.
	_utils.getTranslit = function(str, spaceSymbol){
		
		var trans = {
			"а":"a","б":"b","в":"v","г":"g","д":"d","е":"e", "ё":"yo","ж":"j","з":"z","и":"i","й":"i","к":"k","л":"l", "м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t", "у":"u","ф":"f","х":"h","ц":"c","ч":"ch", "ш":"sh","щ":"sh","ы":"i","э":"e","ю":"u","я":"ya",
			"А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E", "Ё":"Yo","Ж":"J","З":"Z","И":"I","Й":"I","К":"K", "Л":"L","М":"M","Н":"N","О":"O","П":"P", "Р":"R","С":"S","Т":"T","У":"U","Ф":"F", "Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh", "Ы":"I","Э":"E","Ю":"U","Я":"Ya",
			"ь":"","Ь":"","ъ":"","Ъ":""
		};
		
		result =  _utils.phpStrtr(str, trans);
		if(spaceSymbol)
			result = result.replace(/ /g,spaceSymbol);
		
		return result;
	}
	
	//генератор случайного целого числа
	_utils.getRandom = function(min,max)
	{
		return Math.floor(Math.random() * (max - min + 1)) + min;
	}
 
}, '0.0.1' /* module version */, {
    requires: ['node', 'yui', 'io']
});




