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() ? Y.DOM.docScrollY() + 'px' : 0;
	        this.panel.setStyle('left', left);
	        this.panel.setStyle('top', top);
	    },
	    screenCenter: function () {
	        var left = Math.round((Y.DOM.winWidth() - this.panel.get('offsetWidth')) / 2) + 'px',
				top = Math.round((Y.DOM.winHeight() - this.panel.get('offsetHeight')) / 2) + 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', '/Areas/Site/Images/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]);
	            }
	            if (_utils.hasAttribute(this.fieldsArray[i], 'name') && /email/.test(this.fieldsArray[i].getAttribute('name'))) {
	                this.emailErrorHandler(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')
	    },
	    emailErrorHandler: function (el) {
	        var re = new RegExp(el.getAttribute('re'));
	        if (re.test(el.value)) {
	            el.style.color = '#000';
	        }
	        else {
	            el.style.color = '#c00';
	        }
	    },
	    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']
});




