/**
* Singleton class to store utility methods.
* This class MUST be reviewed again.
*/

var controls = [];


Utils = {

    ControlClassNamePrefix: "cls",
    ControlIndexPrefix: "idx",
    ControlNamePrefix: "ctrl",

    ControlContainerClassName: "extControl",
    ControlDynamicElementClassName: "extDynamicElement",
    ControlErrorBoxClassName: "extErrorBox",
    ControlFormClassName: "extForm",
    ControlGlobalProgressClassName: "extGlobalProgress",
    ControlIgnoreClassName: "extIgnore",
    ControlInputClassName: "extChange",
    ControlModalClassName: "extModal",
    ControlProgressClassName: "extProgress",
    ControlStaticElementClassName: "extStaticElement",
    ControlSubmitClassName: "extSubmit",
    ControlValidatorsClassName: "extValidators",
    ControlWysiwygClassName: "extWysiwyg",
    ControlWysiwygWithMediaClassName: "extWysiwygWithMedia",
    ControlWysiwygNoImageClassName: "extWysiwygNoImage",
    ControlWysiwygLinkClassName: "extWysiwygLink",
    ControlWysiwygNoImageLinkClassName: "extWysiwygNoImageLink",
    ControlFileUploadClassName: "extFileUpload",
    ControlCalendarClassName: "extCalendar",
    ControlCalendarEditableClassName: "extCalendarEditable",
    ControlextWysiwygLinkExt: "extWysiwygLinkExt",

    ArticleIsInRotatingBlockMessage: '<div style="color:red;">Current article is in rotating block for this category or its\' parents!</div>',
    ArticleIsInFeaturedCategoryMessage: '<div style="color:red;">Current article is in featured category for this category or its\' parents!</div>',


    MaskParentFormElementByActionName: function(fullActionName) {
        var matches = fullActionName.match(new RegExp("parent_([a-zA-Z0-9:]+)"));
        var parentControlName = matches[1];
        var matches = parentControlName.match(new RegExp(":([a-zA-Z0-9]+)$"));
        if (matches != null) {
            var parentControlName = matches[1];
        }
        var parentControl = Ext.DomQuery.selectNode("div[@class*='" + Utils.ControlNamePrefix + parentControlName + "']");
        var parent = Ext.get(parentControl.id)
        var parentForm = Ext.DomQuery.selectNode("div[@class*='" + Utils.ControlFormClassName + " ']", parent.dom)
        Ext.get(parentForm).mask();
    },

    // Searches element classes for value with gived prefix
    FindClassName: function(el, prefix) {
        var classes = el.dom.className.split(" ");
        var regex = new RegExp("^" + prefix);
        for (var i = 0; i < classes.length; i++) {
            if (classes[i].match(regex)) {
                return classes[i];
            }
        }
        return null;
    },

    // Function parses full action string and retrieves control name
    GetCmdControlName: function(input) {
        var regex = new RegExp("^action_");
        var matches;
        if (input.match(regex)) {
            var regex = new RegExp("^action_([a-zA-Z0-9]+)_");
        }
        else {
            var regex = new RegExp("^([a-zA-Z0-9]+)_");
        }
        var matches = input.match(regex);
        return (matches) ? matches[1] : null;
    },

    // Function parses full action string and retrieves command name
    GetCmdName: function(input) {
        var regex = new RegExp("^action_");
        if (input.match(regex)) {
            regex = new RegExp("^action_[a-zA-Z0-9]+_([a-zA-Z0-9]+)");
        }
        else {
            regex = new RegExp("^[a-zA-Z0-9]+_([a-zA-Z0-9]+)");
        }
        var matches = input.match(regex);
        return (matches) ? matches[1] : null;
    },

    GetControlClassName: function(el) {
        return Utils.FindClassName(el, Utils.ControlClassNamePrefix);
    },

    GetControlIndex: function(el) {
        return Utils.FindClassName(el, Utils.ControlIndexPrefix);
    },

    GetControlName: function(el, removePrefix) {
        var name = Utils.FindClassName(el, Utils.ControlNamePrefix);
        if (name != null && removePrefix) {
            name = name.replace(Utils.ControlNamePrefix, "");
        }
        return name;
    },

    GetFullSolidControlName: function(el) {
        var className = el.dom.className;
        //change
        className = className.replace(/ /g, "_");

        return className;

    },

    GetChildControl: function(el) {
        var res = el.select("." + Utils.ControlContainerClassName, true);
        if (res.elements.length != 0) {
            return Ext.get(res.elements[0]);
        }
        else {
            return null;
        }
    },

    //get parameters of action
    GetControlParams: function(el) {
        var action = null;
        if (el instanceof Ext.Element) {
            action = el.dom.name;
        } else {
            action = el.name;
        }

        if (action == null) {
            return null;
        }

        action = action.replace(/_+/g, "_")
        var splits = action.split('_');
        var j = 0;
        var params = {};
        for (i = 3; i < splits.length - 1; i = i + 2) {
            params[splits[i]] = splits[i + 1];
        }
        return params;
    },

    // Function for control initialization
    InitializeControls: function(rootNode, javascript) {
        Utils.UpdateElementsVisibility();
        if (!rootNode) {
            rootNode = document.body;
        }
        else if (rootNode.parent() != Ext.get(document.body)) {
            rootNode = rootNode.parent();
        }

        var controls = Ext.get(rootNode).select("." + Utils.ControlContainerClassName, true);

        if (controls.elements.length == 0) {
            return;
        }
        for (var i = 0; i < controls.elements.length; i++) {
            var pCtrl = controls.elements[i];
            var elems = pCtrl.select("/." + Utils.ControlValidatorsClassName);
            var validators = (elems.elements.length > 0) ? elems.elements[0].innerHTML : null;
            if (Ext.isIE) // temporary rework for IE7
            {
                pCtrl.dom = document.getElementById(pCtrl.dom.id);
            }

            if (ControlManager.Exists(pCtrl.id)) {
                var ctrl = ControlManager.Get(pCtrl.id);
                ctrl.init();
                ControlHandlerRegistrar.PostControlInit(Utils.GetControlClassName(pCtrl), pCtrl, javascript);
            }
            else {
                var ctrl = Utils.InitializeControl(pCtrl, javascript);
                if (ctrl != null) {
                    ControlManager.Add(pCtrl.id, ctrl);
                }
            }

        }
    },

    InitializeControl: function(el, javascript) {
        var controlClassName = Utils.GetControlClassName(el);

        if (controlClassName) {
            var ctrl = ControlHandlerRegistrar.InitControl(controlClassName, el, javascript);
            controls[controls.length] = ctrl;
            return ctrl;
        }
    },

    // Should be removed somewhere (maybe into control's js)
    IsValidatorValid: function(value) {
        var errMsg = "";
        var currValidator = null;
        var formEl = this.el.findParentNode("." + Utils.ControlFormClassName, 20, true);
        if (formEl.basicForm != null) {// - this code must be uncommented while deployment
            currValidator = formEl.basicForm.baseCtrl.GetValidator(this.getName());
        }

        if (currValidator == null) {
            return true;
        }

        for (var i = 0; i < currValidator.validatorParts.length; i++) {
            switch (currValidator.validatorParts[i].type) {
                case "regEx":
                    var re = new RegExp(currValidator.validatorParts[i].value);

                    if (!value.match(re)) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }

                    break;
                case "minLength":
                    if (value.length < currValidator.validatorParts[i].value) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }

                    break;
                case "maxLength":
                    if (value.length > currValidator.validatorParts[i].value) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }

                    break;
                case "maxValue":
                    if (parseInt(value) > parseInt(currValidator.validatorParts[i].value)) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }
                    break;
                case "minValue":
                    if (parseInt(value) < parseInt(currValidator.validatorParts[i].value)) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }
                    break;
                case "requiredVariable":
                    el = this;
                    if (!eval(currValidator.validatorParts[i].value + "(el)")) {
                        errMsg += currValidator.validatorParts[i].errMsg + "<br />\n";
                    }
                    break;
                case "isSet":
                    break;
            }
        }

        if (errMsg != "") {
            return errMsg;
        }
        else {
            return true;
        }
    },

    // handler for submit buttons "onclick" event
    OnFormSubmit: function() {
        return (!Utils.SupportedBrowser());
    },


    ParseElement: function(Form, el) {
        var currValidator;
        var CloseRe = new RegExp("^action_\\w+_close");

        switch (el.type) {
            case "text":
            case "password":
                var xpath = "div[@title='" + el.name + "'][@class='" + Utils.ControlErrorBoxClassName + "']";
                var errorBox = Ext.DomQuery.selectNode(xpath);
                currValidator = Form.baseCtrl.GetValidator(el);
                /*
                if (errorBox == null && currValidator != null)
                {
                xpath = "div[class^='extForm']:has([id="+ el.id +"'])";
                var parentForm = Ext.DomQuery.selectNode(xpath);
                xpath = "[@class='" + Utils.ControlErrorBoxClassName + "']";
                var errorBox = Ext.DomQuery.selectNode(xpath, parentForm);
                }
                */
                var keyPressHandler = null;
                if (el.getAttribute("onkeyup") != null) {
                    keyPressHandler = el.onkeyup;
                    el.setAttribute("onkeyup", "");
                }

                // check is curr element extCalendar class
                var extEl = Ext.get(el.id);

                if (extEl.hasClass(Utils.ControlCalendarClassName) || extEl.hasClass(Utils.ControlCalendarEditableClassName)) {
                    Form.add(formField = new Ext.form.DateField({
                        allowBlank: ((currValidator == null) ? true : currValidator.allowBlank),
                        blankText: ((currValidator == null) ? "This field is required" : currValidator.blankText),
                        applyTo: el,
                        msgTarget: (errorBox == null) ? "qtip" : errorBox, //errorBox.id,
                        msgDisplay: "block",
                        validateOnBlur: false,
                        validationEvent: false,
                        validator: Utils.IsValidatorValid,
                        readOnly: !extEl.hasClass(Utils.ControlCalendarEditableClassName)
                    }));
                } else {
                    Form.add(formField = new Ext.form.TextField({
                        allowBlank: ((currValidator == null) ? true : currValidator.allowBlank),
                        blankText: ((currValidator == null) ? "This field is required" : currValidator.blankText),
                        applyTo: el,
                        msgTarget: (errorBox == null) ? "qtip" : errorBox, //errorBox.id,
                        msgDisplay: "block",
                        validateOnBlur: false,
                        validationEvent: false,
                        validator: Utils.IsValidatorValid
                    }));
                    formField.clearInvalid();
                }

                Ext.get(el).basicForm = Form;
                el = Ext.get(el);
                if (el.hasClass(Utils.ControlInputClassName)) {
                    el.on("change", Form.baseCtrl.submit, Form.el.select("." + Utils.ControlSubmitClassName, true).elements[0], true);
                }
                if (keyPressHandler != null) {
                    el.on("keyup", keyPressHandler);
                }
                break;
            case "textarea":
                var xpath = "div[@title='" + el.name + "'][@class='" + Utils.ControlErrorBoxClassName + "']";
                var errorBox = Ext.DomQuery.selectNode(xpath);
                currValidator = Form.baseCtrl.GetValidator(el);
                Form.add(formField = new Ext.form.TextArea({
                    allowBlank: ((currValidator == null) ? true : currValidator.allowBlank),
                    blankText: ((currValidator == null) ? "This field is required" : currValidator.blankText),
                    applyTo: el,
                    msgTarget: (errorBox == null) ? "qtip" : errorBox, //errorBox.id,
                    msgDisplay: "block",
                    validateOnBlur: false,
                    validationEvent: false,
                    validator: Utils.IsValidatorValid
                }));
                Ext.get(el).basicForm = Form;
                el = Ext.get(el);
                if (el.hasClass(Utils.ControlInputClassName)) {
                    el.on("change", Form.baseCtrl.submit, Form.el.select("." + Utils.ControlSubmitClassName, true).elements[0], true);
                }
                if ((typeof (tinyMCE) != "undefined") && (el.hasClass(Utils.ControlWysiwygClassName))) {
                    if (el.hasClass(Utils.ControlWysiwygNoImageClassName)) {
                        tinyMCE.init(WYSIWYG_NoImage_Config);
                    }
                    else {
                        if (el.hasClass(Utils.ControlWysiwygWithMediaClassName)) {
                            tinyMCE.init(WYSIWYG_Media_Config);
                        } else {
                            if (el.hasClass(Utils.ControlWysiwygLinkClassName)) {
                                tinyMCE.init(WYSIWYG_Image_Link_Config);
                            } else {
                                if (el.hasClass(Utils.ControlWysiwygWithMediaClassName)) {
                                    tinyMCE.init(WYSIWYG_Image_Link_Config);
                                }
                                else {
                                    if (el.hasClass(Utils.ControlWysiwygNoImageLinkClassName)) {
                                        tinyMCE.init(WYSIWYG_NoImage_Link_Config);
                                    }
                                    else {
                                        if (el.hasClass(Utils.ControlextWysiwygLinkExt)) {
                                            tinyMCE.init(WYSIWYG_Image_Link_Config_Ext)
                                        } else {
                                            tinyMCE.init(WYSIWYG_Image_Config);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    tinyMCE.execCommand("mceAddControl", true, el.dom.id);

                    //fix full screen window truncating:
                    var fixBodyHeight = function() {
                        var winHeight = (typeof (window.innerHeight) != 'undefined') ? window.innerHeight : 2000;
                        if (Ext.getBody().dom.offsetHeight < winHeight) {
                            Ext.getBody().dom.style.height = winHeight + 'px';
                        }
                    }
                    Ext.EventManager.un(window, 'resize', fixBodyHeight);
                    Ext.EventManager.on(window, 'resize', fixBodyHeight);
                    fixBodyHeight();
                }
                break;
            case "hidden":
                var xpath = "div[@title='" + el.name + "'][@class='" + Utils.ControlErrorBoxClassName + "']";
                var errorBox = Ext.DomQuery.selectNode(xpath);
                currValidator = Form.baseCtrl.GetValidator(el);
                Form.add(formField = new Ext.form.TextField({
                    allowBlank: ((currValidator == null) ? true : currValidator.allowBlank),
                    blankText: ((currValidator == null) ? "This field is required" : currValidator.blankText),
                    applyTo: el,
                    hidden: true,
                    msgTarget: (errorBox == null) ? "qtip" : errorBox, //errorBox.id,
                    msgDisplay: "block",
                    validateOnBlur: false,
                    validationEvent: false,
                    validator: Utils.IsValidatorValid
                }));
                Ext.get(el).basicForm = Form;
                break;
            case "checkbox":
               // if (Ext.get(el).basicForm == null) {
                    var label = Ext.DomQuery.selectNode("label[@for='" + el.id + "']");
                    if (label != null) {
                        var labelText = label.innerHTML;
                        var parent = label.parentNode;
                        parent.removeChild(label);
                    }
                    else {
                        var labelText = "";
                    }

                    var checkbox = new Ext.form.Checkbox({
                        applyTo: el,
                        boxLabel: labelText,
                        checked: el.checked,
                        allowDomMove: false
                    });
                    Form.add(checkbox);
                    if (el.getAttribute('onclick') != null) {
                        checkbox.on('check', el.onclick, checkbox.el);
                    }
                    Ext.get(el).basicForm = Form;
               // }
                break;
            case "radio":
                //if (Ext.get(el).basicForm == null) {

                    var label = Ext.DomQuery.selectNode("label[@for='" + el.id + "']");
                    if (label != null) {
                        var labelText = label.innerHTML;
                        var parent = label.parentNode;
                        parent.removeChild(label);
                    }
                    else {
                        var labelText = "";
                    }

                    Form.add(new Ext.form.Radio({
                        applyTo: el,
                        boxLabel: labelText,
                        checked: el.checked,
                        /*!!!!!!!!!!!!!!!!!!!!set emptyFn in onClick!!!!!!!!!!!!!!!!!!!!!*/
                        //onClick: Ext.emptyFn,
                        // this need to get selected value in group elements with equals name
                        onClick: function() {
                            var xpath = "input[@name='" + this.el.dom.name + "']";
                            var inputs = Ext.DomQuery.select(xpath);

                            for (var i = 0; i < inputs.length; i++) {
                                inputs[i].checked = false;
                                var p = inputs[i].parentNode.parentNode;
                                if (Ext.isIE) {
                                    p.setAttribute('className', 'x-form-radio-wrap');
                                }
                                else {
                                    p.setAttribute('class', 'x-form-radio-wrap');
                                }
                            }

                            for (var i = 0; i < inputs.length; i++) {
                                if (this.el.id == inputs[i].id) {
                                    inputs[i].checked = true;
                                    var p = inputs[i].parentNode.parentNode;
                                    if (Ext.isIE)
                                    { p.setAttribute('className', 'x-form-radio-wrap x-form-check-checked'); }
                                    else
                                    { p.setAttribute('class', 'x-form-radio-wrap x-form-check-checked'); }
                                }
                            }

                            if (el.onclick != null) {
                                el.onclick(this);
                            }

                        },
                        getValue: function() {
                            return this.getGroupValue();
                        }
                    }));

                    //Form.add(radioEl);

                    Ext.get(el).basicForm = Form;
               // }
                break;
            case "submit":
                if (el.name.match(CloseRe) == null) {
                    if (Ext.get(el).hasClass('defaultSubmit')) {
                        Form.defaultEnterSubmitter = Ext.get(el);
                    }
                    Ext.get(el).un("click", Form.baseCtrl.submit, Ext.get(el), true);
                    Ext.get(el).on("click", Form.baseCtrl.submit, Ext.get(el), true);
                } else {
                    Ext.get(el).un("click", Form.close, Form, true);
                    Ext.get(el).on("click", Form.close, Form, true);
                    el.name = "";  //every browsers make it possible to change type of element, excepting IE of course
                    //so this hack with blanking name will work even in this damn browser
                    if (!Ext.isIE) {	  // and this implementation for normal browsers
                        var el = Ext.get(el);
                        el.set({ type: "button" });
                    }
                }
                Ext.get(el).basicForm = Form;
                break;
            case "file":


                var elementName = el.name;

                //create container for the ext file input field
                var div = document.createElement('div');
                div.setAttribute('id', elementName + FileUpload.ContainerDivSuffix);
                //only display style attribute is supported
                if (el.style.display != null) {
                    div.style.display = el.style.display;
                }
                var parent = el.parentNode;
                parent.insertBefore(div, el);
                parent.removeChild(el);

                Form.add(formField = new Ext.form.FileUploadField({
                    renderTo: elementName + FileUpload.ContainerDivSuffix,
                    name: elementName
                }));
                Ext.get(el).basicForm = Form;
                el = Ext.get(el);
                break;
        }
    },

    AccordingWithParent: function(element, seekedOnParent_ControlEl) {
        if (!element)
            return false;
        var parentNode = element.findParentNode("." + Utils.ControlContainerClassName, 20, true);

        if (seekedOnParent_ControlEl && parentNode && seekedOnParent_ControlEl.id == parentNode.id)
            return true;
    },

    CheckOnIgnoreParent: function(element) {
        if (!element)
            return false;
        var parentNode = element.findParentNode("." + Utils.ControlIgnoreClassName, 20, true);
        if (parentNode)
            return true;
    },
    //creating ExtJS elements based on Dom elements. Also this method assigns validators. So second parametr should be validator object
    //@param Dom object Form - form to be parsed
    ParseElements: function(Form, root) {
        var FormEl = Ext.getDom(Form.el);
        var ControlEl = Form.el.findParentNode("." + Utils.ControlContainerClassName, 20, true);
        var Elements = [];
        var idx = 0;
        var tmpElems = null;

        if (root != null)
            tmpElems = Ext.DomQuery.select("input,textarea", root.dom);
        else
            tmpElems = Ext.DomQuery.select("input,textarea", FormEl);

        for (var i = 0; i < tmpElems.length; i++) {
            var elem = Ext.get(tmpElems[i]);
            if (!Utils.AccordingWithParent(elem, ControlEl))
                continue
            if (Utils.CheckOnIgnoreParent(elem))
                continue;
            Elements[idx++] = tmpElems[i];
        }
        var currValidator;


        for (var i = 0; i < Elements.length; i++) {
            Utils.ParseElement(Form, Elements[i]);
        }


        Elements = [];
        if (root != null)
            Elements = Ext.DomQuery.select("select", root.dom);
        else
            Elements = Ext.DomQuery.select("select", FormEl);


        for (var i = 0; i < Elements.length; i++) {
            var elem = Ext.get(Elements[i]);
            if (!Utils.AccordingWithParent(elem, ControlEl))
                continue
            if (Utils.CheckOnIgnoreParent(elem))
                continue;
            currValidator = Form.baseCtrl.GetValidator(Elements[i]);
            var xpath = "div[@title='" + Elements[i].name + "'][@class='" + Utils.ControlErrorBoxClassName + "']";
            var errorBox = Ext.DomQuery.selectNode(xpath);
            var listWidth = null;
            var selectName = Elements[i].name;
            var width = Ext.get(Elements[i]).dom.offsetWidth;
            var combo = new AdoramaComboBox({
                transform: Elements[i],
                allowBlank: ((currValidator == null) ? true : currValidator.allowBlank),
                blankText: ((currValidator == null) ? "You must select one" : currValidator.blankText),
                msgTarget: (errorBox == null) ? "qtip" : errorBox,
                msgDisplay: "block",
                validateOnBlur: false,
                validationEvent: false,
                triggerAction: "all",
                editable: false,
                validator: Utils.IsValidatorValid,
                listWidth: width,
                width: width
            });

            if (Elements[i].getAttribute("disabled") != null) {
                if (Elements[i].getAttribute("disabled") == "disabled") {
                    combo.disable();
                }
                //                combo.el.dom.setAttribute("disabled", "disabled");
            }

            if (Elements[i].getAttribute('onchange') != null) {
                combo.on('select', Elements[i].onchange, combo.el);
            }
            Form.add(combo);
            combo.el.basicForm = Form;
            var el = Ext.get(Elements[i]);
            if (el.hasClass(Utils.ControlInputClassName)) {
                combo.on("select", Form.baseCtrl.submit, Form.el.select('input[name=action_' + selectName + '].' + Utils.ControlSubmitClassName, true).elements[0], true);
            }
            combo.render(Form);
            //Form.el.select('input[name=' + selectName + '].' + Utils.ControlSubmitClassName, true)
        }
        /*
        Elements = [];
        if (root != null)
        Elements = Ext.DomQuery.select("textarea", root.dom);
        else
        Elements = Ext.DomQuery.select("textarea", FormEl);

        for (var i = 0; i < Elements.length; i++)
        {
        var elem = Elements[i];
        var element = Ext.get(Elements[i]);
        if (!Utils.AccordingWithParent(element, ControlEl))
        continue
        if(Utils.CheckOnIgnoreParent(element))
        continue;
        currValidator = Form.baseCtrl.GetValidator(elem);
        var xpath = "div[@title='" + elem.name + "'][@class='" + Utils.ControlErrorBoxClassName + "']";            
        var errorBox = Ext.DomQuery.selectNode(xpath);
        var textarea = new Ext.form.TextArea({
        allowBlank: ((currValidator == null)? true : currValidator.allowBlank),
        blankText: ((currValidator == null) ? "This field is required" : currValidator.blankText),
        applyTo: Elements[i],
        msgTarget: (errorBox == null) ? "qtip" : errorBox.id,
        msgDisplay: "block",
        validateOnBlur: false,
        validationEvent: false,
        validator: Utils.IsValidatorValid
        });
        Form.add(textarea);
        textarea.render(Form);
        }*/
    },

    //Remove Field elements from Form.items collection
    RemoveElements: function(Form, root) {
        if (root != null) {
            var rootDom = root.dom;
            var Elements = [];
            Elements = Ext.DomQuery.select("input", rootDom);
            for (var i = 0; i < Elements.length; i++) {
                var elem = Ext.get(Elements[i]);
                if (elem != null) {
                    var field = Form.findField(elem.dom.name);
                    if (field != null)
                        Form.remove(field);
                }
            }

            Elements = [];
            Elements = Ext.DomQuery.select("select", rootDom);
            for (var i = 0; i < Elements.length; i++) {
                var elem = Ext.get(Elements[i]);
                if (elem != null) {
                    var field = Form.findField(elem.dom.name);
                    if (field != null)
                        Form.remove(field);
                }
            }

            Elements = [];
            Elements = Ext.DomQuery.select("textarea", rootDom);
            for (var i = 0; i < Elements.length; i++) {
                var elem = Ext.get(Elements[i]);
                if (elem != null) {
                    var field = Form.findField(elem.dom.name);
                    if (field != null)
                        Form.remove(field);
                }
            }
        }
    },

    //
    SupportedBrowser: function() {
        // TODO implement browser checking
        return true;
    },

    // show or hide elements according to its visibility mode (static or dynamic only)
    UpdateElementsVisibility: function() {
        var elems = Ext.DomQuery.select("." + Utils.ControlStaticElementClassName);

        for (var i = 0; i < elems.length; i++) {
            //Ext.get(elems[i]).remove();
            elems[i].style.display = "none";
        }

        var elems = Ext.DomQuery.select("." + Utils.ControlDynamicElementClassName);

        for (var i = 0; i < elems.length; i++) {
            elems[i].style.display = "block";
        }
    },

    // Function updates content of similar controls and performs its initialization
    UpdateSimilarControls: function(ctrl, html) {
        var controlClassName = Utils.GetControlClassName(ctrl);
        var controlIndex = Utils.GetControlIndex(ctrl);
        var query = (controlIndex == null) ? "[class~='" + controlClassName + "']" : "[class~='" + controlClassName + "'][class~='" + controlIndex + "']";
        var elems = Ext.DomQuery.select(query);
        if (elems.length > 0) {
            for (var i = 0; i < elems.length; i++) {
                var tmpEl = Ext.get(elems[i]);
                tmpEl.update(html);
                Utils.InitializeControl(tmpEl);
            }
        }
    },
    ConfirmAction: function(title, message, handler, scope) {
        Ext.MessageBox.confirm(title, message, handler, scope);
    },
    MsgToolTip: function(title, format) {
        var msgCt = Ext.DomHelper.insertFirst(document.body, { id: "msg-div" }, true);
        msgCt.alignTo(document, "t-t");
        var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1));
        var m = Ext.DomHelper.append(msgCt, { html: Utils.CreateBox(title, s) }, true);
        m.slideIn("t").pause(2).ghost("t", { remove: true });
    },
    CreateBox: function(t, s) {
        return ['<div class="msg">',
                '<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>',
                '<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"><h3>', t, '</h3>', s, '</div></div></div>',
                '<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>',
                '</div>'].join('');
    },
    ProgressBox: function(title, msg) {
        Ext.MessageBox.show({
            //icon: 'ext-mb-download', //custom class in msg-box.html
            modal: true,
            msg: msg,
            //progressText: msg,
            title: title,
            wait: true,
            waitConfig: { interval: 200 },
            width: 250
        });
    }
};