(function(){
    window.uniform = {};
    var it = window.uniform, item = {}, root = {}, frame, contIfr;
    var code, contIfrId, ifrDatId, ifrImgId, formId, pRef;

    var save_un = location.hostname == 'rmediart-s2' ? 'http://rmediart-s2:7778/save_un/save_un' : 'http://'+location.hostname+'/save_un/save_un';
    var sort_un = location.hostname == 'rmediart-s2' ? 'http://rmediart-s2:7778/save_sort/save_sortclass' : 'http://'+location.hostname+'/save_sort/save_sortclass';
    var file_un = location.hostname == 'rmediart-s2' ? 'http://rmediart-s2:7778/upload2base2/upload2base2' : 'http://'+location.hostname+'/upload2base2/upload2base2';
    var multifile_un = location.hostname == 'rmediart-s2' ? 'http://rmediart-s2:7778/files_upload4/file2ritcfiles' : 'http://'+location.hostname+'/files_upload4/file2ritcfiles';
    var image_un = location.hostname == 'rmediart-s2' ? 'http://rmediart-s2:7778/uploadimage2/uploadimage2class' : 'http://'+location.hostname+'/uploadimage2/uploadimage2class';

    code = Math.floor(Math.random() * 99999);
    ufReset();

    it.del = function(cun, pRef) {
        if (!confirm('Вы действительно хотите удалить элемент?')) return false;
        var callback = function() {
            upd.run(pRef);
        }
        var data =
        {
            'smode':'d',
            'id_cun':cun
        };
        postToIframe(data, save_un, callback);
        return false;
    }
    
    it.permission = function(cun, vis, pRef) {
        var callback = function() {
            upd.run(pRef);
        }
        var data =
        {
            'smode':'vis',
            'id_cun':cun,
            'permission':vis
        };
        postToIframe(data, save_un, callback);
        return false;
    }

    it.sort = function(enc, cun, fu, smode, pRef) {
        var callback = function() {
            upd.run(pRef);
        }
        var data =
        {
            'enc':enc,
            'id_cuc':cun,
            'fu':fu,
            'smode':smode
        };
        postToIframe(data, sort_un, callback);
        return false;
    }

    it.close = function() {
        if (it.isSbt == true) {
            setTimeout(function(){
                frame.destroy();
                ufReset();
                setTimeout(function(){
                    upd.run(pRef);
                }, 100);
            }, 100);
        }
    }

    it.imgLoad = function(pRef) {
        //alert(it.imgLoadStage);
        var ifr = byId(ifrImgId);
        switch (it.imgLoadStage) {
            case 1: // Загрузили форму для обрезки картинки. Надо показаться на весь экран.
                with(ifr.style) {
                    position = 'absolute';
                    left = top = '0px';
                    height = document.body.clientHeight + 'px';
                    width = document.body.clientWidth + 'px';
                    border = 'none';
                    backgroundColor = '#FFFFFF';
                    zIndex = 999;
                    }
                window.scrollTo(0, 0);
                break;
            case 3: // Сохранили вторую картинку. Надо закрыться и обновиться.
                with(ifr.style) {
                    position = '';
                    left = top = '0px';
                    height = '0px';
                    width = '0px';
                    border = 'none';
                    backgroundColor = '#FFFFFF';
                    zIndex = -1;
                    }
                setTimeout(function(){
                    frame.destroy();
                    ufReset();
                    setTimeout(function(){
                        upd.ref();
                    }, 100);
                }, 100);
                break;
        }
        it.imgLoadStage++;
    }

    it.validate = function() {
        //var out='';
        var result=true, resField={};
        for (var i in item.field) {
            if(item.field[i]._p.name !== 'cun_name') {
                try {
                    resField[item.field[i]._p.fu] = it.validate[item.field[i]._p.type](item.field[i]);
                    result = result==false ? false : resField[item.field[i]._p.fu].status;
                } catch (e) {
                    if (browser.isMozilla)
                        console.log(e);
                }
            //out+=f.message+'\n';
            }
        }

        it.validate.changeError(resField);

        if (result) {
            it.isSbt = true;
            byId(formId).style.display = 'none';
            frame.setPreloader();
            return true;
        }
        else {
            //alert(out);
            return false;
        }
    }

    it.validate.changeError = function(resField) {
        for (var i in resField) {
            var el = byId('error_'+i);
            if (el !== null)
                if(!resField[i].status) {
                    el.style.display = '';
                    el.innerHTML = resField[i].message;
                } else {
                    el.style.display = 'none';
                    el.innerHTML = '';
                }
        }
    }

    it.validate.text = function(field) {
        var result={
            'status':true,
            'message':''
        };
        if (field._p.required==1 && byId('fu_'+field._p.fu).value=='') {
            result.status = false;
            result.message = 'Поле "'+field._p.name+'" не должно быть пустым.';
        }
        return result;
    }

    it.validate.num = function(field) {
        var result={
            'status':true,
            'message':''
        }, value = byId('fu_'+field._p.fu).value;
        if (field._p.required==1 && checkNum(value)==false) {
            result.status = false;
            result.message = 'Поле "'+field._p.name+'" не заполнено, или не является числом.';
        }
        if (field._p.required==0 && value!='' && checkNum(value)==false) {
            result.status = false;
            result.message = 'Поле "'+field._p.name+'" не не является числом.';
        }
        return result;

        function checkNum(value) {
            if (value=='')
                return false;
            var val = parseInt(value)+'';
            if (val!==value || isNaN(val))
                return false;
            else
                return true;
        }
    }

    it.validate.date = function(field) {
        var result={
            'status':true,
            'message':''
        }, value = byId('fu_'+field._p.fu).value;
        if (field._p.required==1 && checkDate(value)==false) {
            result.status = false;
            result.message = 'Поле "'+field._p.name+'" не заполнено, или не соответствует формату даты "дд/мм/гг".';
        }
        if (field._p.required==0 && value!='' && checkDate(value)==false) {
            result.status = false;
            result.message = 'Поле "'+field._p.name+'" не соответствует формату даты "дд/мм/гг".';
        }
        return result;

        function checkDate(value) {
            if (value=='' || value.length!=10)
                return false;
            value = value.split('/');
            if (value.length==3 && value[0]<=31 && value[1]<=12 && value[2]>=1000)
                return true;
            else
                return false;
        }
    }

    it.validate.time = function(field) {
        var result={
            'status':true,
            'message':''
        }, value = byId('fu_'+field._p.fu).value;
        if (field._p.required==1) {
            if (checkTime(value)==false) {
                result.status = false;
                result.message = 'Поле "'+field._p.name+'" не заполнено, или не соответствует формату времени "чч:мм".';
            }
        } else {
            if (value!='' && checkTime(value)==false) {
                result.status = false;
                result.message = 'Поле "'+field._p.name+'" не соответствует формату времени "чч:мм".';
            }
        }
        return result;

        function checkTime(value) {
            if (value=='' || value.length!=5)
                return false;
            value = value.split(':');
            if (value.length==2 && value[0]<=23 && value[1]<=59)
                return true;
            else
                return false;
        }
    }

    it.make = function(_root, _item) {
        root = _root.root;
        item = _item.item;
        var tmpl='';
        var btDel = (jsv('item.field[1].file._p.fid',-1) > -1) || (jsv('item.field[1].image._p.fid',-1) > -1) ? '<input type="submit" name="smode" value="Удалить" class="delete" onclick="return confirm(\'Удаление необратимо. Хотите продолжить?\')"/>\n' : '';
        var btSave = jsv('item._p.cun',0)>0 ? '<input type="submit" name="smode" value="Сохранить" class="save"/>' : '<input type="submit" name="smode" value="Добавить" class="save"/>';
        var frameTitle = jsv('item._p.alias') !== '' ? item._p.alias : item._p.sus;
        ufSetIds();
        frame = new CFrame(frameTitle, 'm-uniForm-width');
        tmpl = '<div class="uniForm">\n';
        switch (jsv('item.field[1]._p.type')) {
            case 'file':
                tmpl += '<form id="'+formId+'" action="'+file_un+'" method="post" target="'+ifrDatId+'" onsubmit="return uniform.validate()" enctype="multipart/form-data">\n';
                break;
            case 'multifile':
                tmpl += '<form id="'+formId+'" action="'+multifile_un+'" method="post" target="'+ifrDatId+'" onsubmit="return uniform.validate()" enctype="multipart/form-data">\n';
                break;
            case 'image':
                tmpl += '<form id="'+formId+'" action="'+image_un+'" method="post" target="'+ifrImgId+'" onsubmit="return uniform.imgLoad()" enctype="multipart/form-data">\n';
                break;
            default:
                var cun_name = jsv('item.field[0].fieldValue._t') !== '' ? jsv('item.field[0].fieldValue._t') : 'fu_'+item.field[0]._p.fu;
                tmpl += '<form id="'+formId+'" action="'+save_un+'" method="post" target="'+ifrDatId+'" onsubmit="return uniform.validate()">\n\
                <input type="hidden" name="sus" value="'+jsv('item._p.sus')+'"/>\n\
                <input type="hidden" name="id_cun" value="'+jsv('item._p.cun')+'"/>\n\
                <input type="hidden" name="enc" value="'+jsv('item._p.enc')+'"/>\n\
                <input type="hidden" name="enc2" value="'+jsv('item._p.enc2')+'"/>\n\
                <input type="hidden" name="cun_name" value="'+cun_name+'"/>\n';
                break;
        }
        tmpl += '<table>';
        if (item.field.length)
            for (var i in item.field)
                if(item.field[i]._p.name !== 'cun_name')
                    tmpl += it.renderField(item.field[i]);

        tmpl += '<tr class="uniForm-save">\n\
                <td colspan="2"><div class="left"><input type="reset" value="Сбросить" class="cancel"/></div><div class="right">'+btSave+btDel+'</div></td>\n\
            </tr>\n\
        </table>\n\
    </form>\n\
</div>';
        //alert(tmpl);
        // Внедряем фреймы сохранения в страницу
        if (contIfr === undefined) {
            var tmplFrames = '<iframe name="'+ifrImgId+'" id="'+ifrImgId+'" height="0" width="0" src="about:blank" onload="uniform.imgLoad()">Пожалуйста ждите...</iframe>\n\
<iframe name="'+ifrDatId+'" id="'+ifrDatId+'" height="0" width="0" src="about:blank" onload="uniform.close()"></iframe>\n';
            contIfr = document.createElement('div');
            contIfr.id=contIfrId;
            with(contIfr.style){
                width='0px'
                height='0px'
                }
            document.body.appendChild(contIfr);
            contIfr.innerHTML=tmplFrames;
        }
        frame.setContent(tmpl);
        try {
            if (item.field[0]._p.name !== 'cun_name')
                moveCaretEnd(byId('fu_'+item.field[0]._p.fu));
            else
                moveCaretEnd(byId('fu_'+item.field[1]._p.fu));
        } catch (e) {}
        return false;
    }

    it.renderField = function(field) {
        var result='', fValue='', fTitle='', fType=field._p.type;
        
        if (field.fieldValue._t !== undefined) {
            fValue = field.fieldValue._t;
        } else {
            if (field.fieldValue.option !== undefined) {
                fValue = field.fieldValue.option;
                fType = 'dynList';
            }
        }

        fTitle = field.title !== undefined && field.title._t !== undefined ? field.title._t : field._p.name;
        if (field._p.required == 1)
            fTitle += '<span style="color:#FF4400">*</span>';

        if (fType === undefined)
            fType = 'text';
        //result += '<!-- Type: '+fType+' -->\n';
        //result += '<!-- Name: '+field._p.name+' -->\n';
        switch (fType) {
            // Скрытое
            case 'hidden':
                result += '<input type="hidden" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'"/>\n';
                break;
            // Инкремент
            case 'increment':
                result += '<input type="hidden" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'"/>\n';
                break;
            // Текст
            case 'text':
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><input type="text" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'"/>'+it.renderError(field)+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            case 'date':
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><input type="text" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'" size="10" maxlength="10" onclick="event.cancelBubble=true;/*this.select();*/lcs(this)" onfocus="/*this.select();*/lcs(this)"/>'+it.renderError(field)+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // readonly="readonly"
            case 'time':
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><input type="text" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'" size="5" maxlength="5"/>'+it.renderError(field)+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Число
            case 'num':
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><input type="text" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'"/>'+it.renderError(field)+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Многострочный текст
            case 'textarea':
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><textarea id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'">'+fValue+'</textarea>'+it.renderError(field)+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Статический выпадающий список
            case 'staticList':
                var options='';
                for (var j in field.options.option) {
                    var selected = field.options.option[j]._p.value == fValue ? 'selected="selected"' : '';
                    options += '<option '+selected+' value="'+field.options.option[j]._p.value+'">'+field.options.option[j]._t+'</option>';
                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><select id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'">'+options+'</select>'+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Динамический выпадающий список
            case 'dynList':
                var options='';
                if (typeof fValue[0] == 'object')
                    for (var j in fValue) {
                        var selected = fValue[j]._p !== undefined && fValue[j]._p.selected !== undefined ? 'selected="selected"' : '';
                        var key = fValue[j].key !== undefined && fValue[j].key._t !== undefined ? fValue[j].key._t : '';
                        var val = fValue[j].val !== undefined && fValue[j].val._t !== undefined ? fValue[j].val._t : '';
                        options += '<option '+selected+' value="'+key+'">'+val+'</option>';
                    }
                else {
                    var key = fValue.key !== undefined && fValue.key._t !== undefined ? fValue.key._t : '';
                    var val = fValue.val !== undefined && fValue.val._t !== undefined ? fValue.val._t : '';
                    options += '<option value="'+key+'">'+val+'</option>';
                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td><select id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'">'+options+'</select>'+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Статический набор радиобатонов
            case 'staticRadio':
                var options='', checked=0;
                for (var j in field.options.option)
                    checked = field.options.option[j]._p.value == fValue ? j : checked;
                for (var j in field.options.option) {
                    var selected = checked == j ? 'checked="checked"' : '';
                    options += '<p>';
                    options += '<input type="radio" id="fu_'+field._p.fu+'_'+j+'" name="fu_'+field._p.fu+'" value="'+field.options.option[j]._p.value+'" '+selected+'/>';
                    options += '<label for="fu_'+field._p.fu+'_'+j+'">'+field.options.option[j]._t+'</label>';
                    options += '</p>';
                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td>'+options+'\n\
                </tr>\n';
                break;
            // Файл
            case 'file':
                var ftype='', fname='', fid=-1;
                if (field.file !== undefined) {
                    ftype = field.file._p.ftype;
                    fname = field.file._p.fname;
                    fid = field.file._p.fid;
                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td>\n\
                    <input type="hidden" name="id_cun" value="'+item._p.cun+'"/>\n\
                    <input type="hidden" name="fu" value="'+field._p.fu+'"/>\n\
                    <input type="hidden" name="fid" value="'+fid+'"/>\n\
                    <input type="file" id="file1" name="file1" value="'+ftype+'"/>\n\
                </td>\n\
                </tr>\n\
                <tr class="uniForm-text">\n\
                <th>Отображаемое имя:</th>\n\
                <td><input type="text" id="fname" name="fname" value="'+fname+'"/>'+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            // Куча файлов 2
            case 'multifile':
                ftype='', fname='', fid=-1;
                if (field.file !== undefined/* && field.file.length === 1*/) {
                    ftype = field.file._p.ftype;
                    fname = field.file._p.fname;
                    fid = field.file._p.fid;
                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td>\n\
                    <input type="hidden" name="id_cun" value="'+item._p.cun+'"/>\n\
                    <input type="hidden" name="fu" value="'+field._p.fu+'"/>\n\
                    <input type="hidden" name="fid" value="'+fid+'"/>\n\
                    <input type="file" id="file1" name="file1" value="'+ftype+'"/>\n\
                </td>\n\
                </tr>\n\
                <tr class="uniForm-text">\n\
                <th>Отображаемое имя:</th>\n\
                <td><input type="text" id="fname" name="fname" value="'+fname+'"/>'+it.renderDescr(field)+'</td>\n\
                </tr>\n';
                break;
            case 'image':
                var fu_small='', idBimg=-1, idSimg=-1, widthIMG=300, Sw=50, Sh=50;
                var f;
                if (field.image !== undefined)
                    idBimg = field.image._p.fid;
                if (field.param !== undefined)
                    if (field.param._p.width !== undefined)
                        widthIMG = field.param._p.width;
                for (var i in item.field) {
                    f = item.field[i];
                    if (field.param !== undefined && f._p.name == field.param._p.relation) {
                        fu_small=f._p.fu;
                        if (f.image !== undefined)
                            idSimg=f.image._p.fid;
                        if (f.param !== undefined) {
                            if (f.param._p.width !== undefined)
                                Sw=f.param._p.width;
                            if (f.param._p.height !== undefined)
                                Sh=f.param._p.height;
                        }
                        break;
                    }

                }
                result += '<tr class="uniForm-'+fType+'">\n\
                <th>'+fTitle+':</th>\n\
                <td>\n\
                    <input type="hidden" name="id_cun" value="'+item._p.cun+'"/>\n\
                    <input type="hidden" name="fu_big" value="'+field._p.fu+'"/>\n\
                    <input type="hidden" name="fu_small" value="'+fu_small+'"/>\n\
                    <input type="hidden" name="idBimg" value="'+idBimg+'"/>\n\
                    <input type="hidden" name="idSimg" value="'+idSimg+'"/>\n\
                    <input type="hidden" name="widthIMG" value="'+widthIMG+'"/>\n\
                    <input type="hidden" name="Sw" value="'+Sw+'"/>\n\
                    <input type="hidden" name="Sh" value="'+Sh+'"/>\n\
                    <input type="file" id="file1" name="file1"/>\n\
                </td>\n\
                </tr>\n';
                break;
            // НЛО!!!
            default:
                //result += '<!-- Тип "'+fType+'" не определён -->\n';
                result += '<input type="hidden" id="fu_'+field._p.fu+'" name="fu_'+field._p.fu+'" value="'+fValue+'"/>\n';
                break;
                break;
        }
        return result;
    }

    it.renderDescr = function(field) {
        if (field.descr !== undefined && field.descr._t !== '') {
            var required = field._p.required == 1 ? ' required' : '';
            return '<p class="uniForm-descr'+required+'">'+field.descr._t+'</p>\n';
        }
        else
            return '';
    }

    it.renderError = function(field) {
        return '<p id="error_'+field._p.fu+'" class="uniForm-error" style="display:none"></p>\n';
    }

    function jsv(el, df) {
        try {
            var r=eval(el);
            if (r!==undefined&&r!==null) return r
            else return df!==undefined&&df!==null?df:'';
        } catch (e) {
            return df!==undefined&&df!==null?df:'';
        }
    }

    function ufSetIds() {
        contIfrId = 'div'+code;
        formId = 'form'+code;
        ifrDatId = 'iframe'+code;
        ifrImgId = 'iframeImg'+code;
        pRef = root.pRef._t;
    }

    function ufReset() {
        it.pRef = undefined;
        it.isSbt = false;
        it.imgLoadStage = 0;
    }
})();
