﻿function ControlsManager()
{
    
    this.tabs = new Array();
    this.controls = new Array();
    this.groups = new Array();
    this.cc = this.controls; // for simplification
    
    this.initialized = false;
    
    this.classInitializer = null;
    
    this.CommonAddTemplate = '<a href="#" cmanager="add" class="GHCManagerCommand GHCManagerCommandAdd">$1</a>';
    this.CommonApplyCancelTemplate = '<a href="#" cmanager="save" class="GHCManagerCommand GHCManagerCommandSave">save</a><a href="#" cmanager="cancel" class="GHCManagerCommand GHCManagerCommandCancel">cancel</a>';
    this.CommonEditDeleteTemplate = '<a href="#" cmanager="edit" class="GHCManagerCommand GHCManagerCommandEdit">edit</a><a href="#" cmanager="delete" class="GHCManagerCommand GHCManagerCommandRemove">remove</a>';
    this.CommonEditTemplate = '<a href="#" cmanager="edit" class="GHCManagerCommand GHCManagerCommandEdit">edit</a>';
    this.CommonSectionEditTemplate = '<input type="text" onblur="CManager.SectionHeaderBlurHandler();" onkeydown="CManager.SectionHeaderKeydownHandler();" cmanager=":headeredit" class="LPressSectionHeaderEdit" />';
    
    this.TabSettingsPVisibleClick = function(e)
    {
        var tab = this.GetActiveTab();
        if(tab)
        {
            PageMethods.ProcessPressPageItems([[0, 'tabpvisible', tab.mode, this.tabSettings.controls.pvisible.container.checked ]], null, null);
            tab.pvisible = this.tabSettings.controls.pvisible.container.checked;
        }
    }
    this.TabSettingsLayoutClick = function(e)
    {
        var tab = this.GetActiveTab();
        if(tab)
        {
            var bIsHorizontal = this.tabSettings.controls.layout.controls.horizontal.container.checked;
            PageMethods.ProcessPressPageItems([[0, 'tabhorizontal', tab.mode, bIsHorizontal ]], null, null);
            tab.vertical = !bIsHorizontal;
            if(tab.content)
            {
                tab.content.className = 'content' + (bIsHorizontal ? '' : ' LPressTabVertical');
            }
        }
    }
    
    this.InitializePage = function(sTabsIDs, sTabsClickClass, classInitializer, sTabSettingsClientID, bIsEditable)
    {
        this.editable = bIsEditable;
        
        if(!this.initialized)
        {
            this.initialized = true;
            MManager.addClickHandler(null, function(ev, source, sender){return CManager.TabsClickHandler(ev, source, sender);}, sTabsClickClass);
            if(this.editable)
            {
                MManager.addClickHandler(null, function(ev, source, sender){return CManager.CommandClickHandler(ev, source, sender);}, 'GHCManagerCommand');
                MManager.addClickHandler(null, function(ev, source, sender){return CManager.SectionHeaderClickHandler(ev, source, sender);}, 'GHCManagerSectionCaption');
                MManager.addClassHandler('GHCManagerSectionCaption', null, null, 'GHCManagerSectionCaption GHCManagerSectionCaptionOver');
            }
        }
    
        if(sTabSettingsClientID && this.editable)
        {
            this.tabSettings = this.ParseCControl($get(sTabSettingsClientID), null, null, null);
            this.tabSettings.controls.pvisible.container.onclick = function(e){CManager.TabSettingsPVisibleClick(e)};
            this.tabSettings.controls.layout.controls.horizontal.container.onclick = function(e){CManager.TabSettingsLayoutClick(e)};
            this.tabSettings.controls.layout.controls.vertical.container.onclick = function(e){CManager.TabSettingsLayoutClick(e)};
        }
        
        this.classInitializer = classInitializer;    
        this.tabs = new Object();
        var ids = (sTabsIDs || '').split('|');
        var activeTab = null;
        for (var i = 0; i < ids.length; i++)
        {
            var it = ids[i];
            var el = $get(it);
            if(el)
            {
                var tab = this.ParseTabContent(el);
                if(tab.active)
                {
                    activeTab = tab;
                }
                this.tabs[tab.mode] = tab;
            }
        }
        if(activeTab)
        {
            this.PrepareTabSettings(activeTab);
            activeTab.initialized = true;
            if(this.classInitializer && this.classInitializer.OnTabFirstTimeSelected)
                this.classInitializer.OnTabFirstTimeSelected(activeTab);
        }
    }
    
    this.GetTabByMode = function(mode)
    {
        for(var n in this.tabs)
        {
            if(n == mode)
            {
                return this.tabs[n];
            }
        }
        return null;
    }
    this.GetActiveTab = function()
    {
        for (var n in this.tabs)
        {
            var it = this.tabs[n];
            if(it.active)
            {
                return it;
            }
        }
        return null;
    }
    this.SetActiveTab = function(tab)
    {
        var act = this.GetActiveTab();
        if(act && tab != act)
        {
            if(act && this.classInitializer && this.classInitializer.OnTabBeforeUnselected)
                this.classInitializer.OnTabBeforeUnselected(act);
            act.active = false;
        }
        
        if(!tab.initialized)
        {
            tab.initialized = true;
            if(this.classInitializer && this.classInitializer.OnTabFirstTimeSelected)
                this.classInitializer.OnTabFirstTimeSelected(tab);
        }
        
        if(this.classInitializer && this.classInitializer.OnTabBeforeSelected)
            this.classInitializer.OnTabBeforeSelected(tab);
        
        tab.active = true;
        this.PrepareTabSettings(tab);
    }
    
    this.GetParentCObject = function(node)
    {
        var p = node;
        while(p && !p.cobject)
             p = p.parentNode;
        
        if(p)
            return p.cobject;
        else
        {
            alert('Parent CObject not found.');
            return null;
        }
    }
    this.GetParentCObjectEx = function(e)
    {
        var sender = (e && e.target ? e.target : event.srcElement);
        return this.GetParentCObject(sender);
    }
    
    this.CommandClickHandler = function(ev, source, sender)
    {
        ev.returnValue = false;
        var result = null;
        if(this.classInitializer && this.classInitializer.OnCommandRequest)
        {
            result = this.classInitializer.OnCommandRequest(this.GetParentCObject(sender), sender.getAttribute('cmanager'), ev);
        }
        if(ev.returnValue == false || result == false)
            return false;
    }
    
    this.SectionHeaderClickHandler = function(ev, source, sender)
    {
        var p = this.GetParentCObject(sender)
             
        var s = p.section;
        var cpt = s.controls.header.controls.caption;
        var ed = s.controls.header.controls.edit;
        var editor = s.controls.headeredit.container;
        cpt.container.style.display = 'none';
        ed.container.style.display = '';
        editor.value = cpt.container.innerText || cpt.container.textContent || '';
        ed.initialValue = editor.value;
        editor.focus();
        editor.select();
    }
    this.SectionHeaderBlurHandler = function(e)
    {
        var sender = (e && e.target ? e.target : event.srcElement);
        var obj = this.GetParentCObject(sender);
        this.SectionHeaderHide(obj);
        var cc = obj.section.controls;
        if(cc.header.controls.edit.initialValue != cc.headeredit.container.value)
        {
            cc.header.controls.caption.container.innerText = cc.header.controls.caption.container.textContent = cc.headeredit.container.value;
            PageMethods.ProcessPressPageItems([[ 0, 'sectionheader', obj.section.id, cc.headeredit.container.value ]], function(pm){CManager.CommonCallback(pm);}, null);
        }
    }
    this.SectionHeaderKeydownHandler = function(e)
    {
        var sender = (e && e.target ? e.target : event.srcElement);
        var obj = this.GetParentCObject(sender);
        var keynum;
        if(window.event) // IE
            keynum = window.event.keyCode;
        else if(e.which) // Netscape/Firefox/Opera
            keynum = e.which;
        
        if(keynum == 13)
        {
            this.SectionHeaderHide(obj);
        }
        else if(keynum == 27)
        {
            obj.section.controls.headeredit.container.blur();
            this.SectionHeaderApply(obj);
        }
    }
    this.SectionHeaderHide = function(el)
    {
        el.section.controls.header.controls.caption.container.style.display = '';
        el.section.controls.header.controls.edit.container.style.display = 'none';
    }
    
    this.ShowElement = function(bShow, explicit)
    {
        if (this.container)
            this.container.style.display = bShow == false ? (explicit ? '' : 'none') : (explicit ? 'block' : '');
    }
    this.ShowElementEx = function (iCustomIsVisible, explicit)
    {
        alert('ShowElementEx is obsolete!');
        if (this.container)
            this.container.style.display = iCustomIsVisible ? (explicit ? 'block' : '') : (explicit ? '' : 'none');
    }
    this.HideElement = function()
    {
        if(this.container)
            this.container.style.display = 'none';
    }
    this.RemoveChildren = function ()
    {
        this.cc = new Object();
        this.controls = this.cc;
        this.container.innerHTML = '';
    }
    this.GetElementInnerText = function()
    {
        if(this.container)
        {
            if(this.container.getValue)
                return this.container.getValue();
            else
                return document.all ? this.container.innerText : this.container.textContent;
        }
        else return '';
    }
    this.SetElementInnerText = function(value)
    {
        if(this.container)
        {
            if(this.container.setValue)
                this.container.setValue(value);
            else if(document.all)
                this.container.innerText = value || '';
            else
                this.container.textContent = value || '';
        }
    }
    this.GetElementEnabled = function()
    {
        return this.enabled != false && this.enabledParent != false && (!this.parent || this.parent.isenabled());
    }
    this.SetElementEnabled = function(isEnabled, bByParent)
    {
        var enabledPrev = this.enabled;
        if(!bByParent)
        {
            this.enabled = isEnabled;
            if(isEnabled)
                Extensions.RemoveCssClass(this.container, 'dis');
            else
                Extensions.AddCssClass(this.container, 'dis');
        }
        else this.enabledParent = isEnabled;
        
        if(enabledPrev == false && bByParent && isEnabled)
            return;
            
        this.container.disabled = !isEnabled;
        if(this.checkbox)
            this.checkbox.disabled = !isEnabled;
        
        if(this.container.onclick)
        {
            if(isEnabled)
            {
                if(this.nativeOnClick)
                    this.container.onclick = this.nativeOnClick;
            }
            else
            {
                this.nativeOnClick = this.container.onclick;
                this.container.onclick = function(e){return false;}
            }
        }
        
        for(var n in this.controls)
        {
            var c = this.controls[n];
            if(!c.setenable)//collection
            {
                for (var i = 0; i < c.length; i++)
                {
                    var it = c[i];
                    it.setenable(isEnabled, true);
                }
            }
            else c.setenable(isEnabled, true);
        }
    }
    this.GetTelerik = function()
    {
        if(!this.telerikObj)
            this.telerikObj = $find(this.container.id);
        return this.telerikObj;
    }
    this.initializeInput = function (control)
    {
        control.c.setValue = mbi.extensions.setInputBoxValue;
        control.setValue = function (value) { control.c.setValue(value); }
        control.c.getValue = mbi.extensions.getInputBoxValue;
        control.getValue = function () { return control.c.getValue(); }

        mbi.extensions.inputBoxInit(control.c);

        if (control.c.getAttribute('placeHolder'))
        {
            (function ()
            {
                if (control.c.onfocus)
                {
                    var f = control.c.onfocus;
                    control.c.onfocus = function (e) { mbi.extensions.onInputBoxFocus(e); f(e); }
                }
                else control.c.onfocus = mbi.extensions.onInputBoxFocus;
            })();

            (function ()
            {
                if (control.c.onblur)
                {
                    var f = control.c.onblur;
                    control.c.onblur = function (e) { mbi.extensions.onInputBoxBlur(e); f(e); }
                }
                else control.c.onblur = mbi.extensions.onInputBoxBlur;
            })();

            if (control.params.onchange)
            {
                (function ()
                {
                    if (control.c.oncut)
                    {
                        var f = control.c.oncut;
                        control.c.oncut = function (e) { this.onHtmlElementChange(e); f(e); }
                    }
                    else control.c.oncut = this.onInputBoxChange;
                })();
                (function ()
                {
                    if (control.c.onpaste)
                    {
                        var f = control.c.onpaste;
                        control.c.onpaste = function (e) { this.onHtmlElementChange(e); f(e); }
                    }
                    else control.c.onpaste = this.onInputBoxChange;
                })();
                (function ()
                {
                    if (control.c.oninput)
                    {
                        var f = control.c.oninput;
                        control.c.oninput = function (e) { this.onHtmlElementChange(e); f(e); }
                    }
                    else control.c.oninput = this.onInputBoxChange;
                })();
                (function ()
                {
                    if (control.c.oninput)
                    {
                        var f = control.c.oninput;
                        control.c.oninput = function (e) { this.onHtmlElementChange(e); f(e); }
                    }
                    else control.c.oninput = this.onInputBoxChange;
                })();
                (function ()
                {
                    if (control.c.onkeydown)
                    {
                        var f = control.c.onkeydown;
                        control.c.onkeydown = function (e) { this.onHtmlElementChange(e); f(e); }
                    }
                    else control.c.onkeydown = this.onInputBoxChange;
                })();

            }
        }
    }
    this.onHtmlElementChange = function (e)
    {
        var p = e && e.target ? e.target : event.srcElement;
        p.cobject.dirty = true;
        if (p.cobject.params.onchange)
            p.cobject.params.onchange(p.cobject);
    }

    this.SetCheckboxValue = function (value)
    {
        this.core.checked = !!value;
    }
    this.GetCheckboxValue = function ()
    {
        return this.core.checked;
    }
    this.GetTelerikValue = function ()
    {
        if (this.telerik().get_html)
            return this.telerik().get_html();
    }
    this.SetTelerikValue = function (value)
    {
        if (this.telerik().set_html)
            this.telerik().set_html(value || '');
    }

    this.SetDropdownValue = function (value)
    {
        for (var i = 0; i < this.c.options.length; i++)
        {
            var it = this.c.options[i];
            if (it.value == '' + value || value == false && it.value == 'false' || value == true && it.value == 'true')
            {
                it.selected = true;
                return;
            }
        }

        if (this.c.options.length > 0)
            this.c.options[0].selected = true;
    }
    this.GetRadioValue = function ()
    {
        for (var i = 0; i < this.group.length; i++)
        {
            var it = this.group[i];
            if (it.core.checked)
                return it.params.value || null;
        }
        return null;
    }
    this.SetRadioValue = function (value)
    {
        for (var i = 0; i < this.group.length; i++)
        {
            var it = this.group[i];
            it.core.checked = (value || '') == (it.params.value || '');
        }
    }
    this.GetDropdownValue = function ()
    {
        return this.c.value;
    }
    this.CommonCallback = function(pm)
    {
        if(!pm.IsLogged)
        {
            showLogin();
            return;
        }
    }
    
    this.TabsClickHandler = function(ev, source, sender)
    {
        var mode = source.getAttribute('smode') || source.parentNode.getAttribute('smode');
        if(mode)
        {
            var it = this.GetTabByMode(mode);
            if(it)
            {
                var act = this.GetActiveTab();
                if(act != it)
                {
                    this.SetActiveTab(it);
                    gSIT(source, ev);
                }
            }
            ev.returnValue = false;
            ev.cancelBubble = true;
            return false;
        }
    }
    
    this.PrepareTabSettings = function(tab)
    {
        if(this.tabSettings)
        {
            var st = this.tabSettings;
            st.container.style.display = '';
            st.controls.pvisible.container.checked = tab.pvisible == true;
            st.controls.layout.container.style.display = tab.layoutChangable ? '' : 'none';
            st.controls.layout.controls.horizontal.container.checked = tab.vertical != true;
            st.controls.layout.controls.vertical.container.checked = tab.vertical == true;
        }
    }
    this.ParseTabContent = function(el)
    {
        var res = new Object();
        var attrs = (el.getAttribute('cmanager') || '').split(':');
        if(attrs.length > 0 && attrs[0] == '')
        {
            attrs.splice(0, 1);
        }
        for (var i = 0; i < attrs.length; i++)
        {
            var param = attrs[i];
            if(param == 'allowlayoutchanging')
            {
                res.layoutChangable = true;
            }
            else if(param == 'vertical')
            {
                res.vertical = true;
            }
            else if(param == 'selected')
            {
                res.active = true;
            }
            else if(param == 'pvisible')
            {
                res.pvisible = true;
            }
        }
        
        res.mode = el.getAttribute('smode') || '';
        res.active = el.style.display != 'none';

        res.container = el;
        res.c = el;
        res.sections = new Object();
        
        var items = el.getElementsByTagName('div');
        for (var i = 0; i < items.length; i++)
        {
            var it = items[i];
            var attr = it.getAttribute('cmanager');
            if(attr)
            {
                if(attr.indexOf(':') == 0)
                {
                    var cname = attr.split(':');
                    if(cname.length > 1)
                    {
                        if(cname[1] == 'section')
                        {
                            var sect = new Object();
                            sect.container = it;
                            sect.c = it;
                            sect.tab = res;
                            sect.controls = new Object();
                            sect.cc = sect.controls;
                            sect.templates = new Object();
                            
                            for (var j = 0; j < cname.length; j++)
                            {
                                var param = cname[j];
                                if(param.indexOf('id#') == 0)
                                {
                                    sect.id = parseInt(param.replace('id#', '')) || -1;
                                }
                                else if(param == 'editable')
                                {
                                    sect.editable = true;
                                }
                            }
                            res.sections[sect.id] = sect;
                            
                            var contAttr = it.parentNode.getAttribute('cmanager');
                            if(contAttr == ':content')
                            {
                                sect.containerType = 0;
                            }
                            else if(contAttr == ':contentpre')
                            {
                                sect.containerType = -1;
                            }
                            else if(contAttr == 'contentafter')
                            {
                                sect.containerType = 1;
                            }
                            this.ParseSectionContent(sect);
                        }
                        else if(cname[1] == 'tabcontent')
                        {
                            res.content = it;
                        }
                        else if(cname[1] == 'tabcontentpre')
                        {
                            res.contentpre = it;
                        }
                        else if(cname[1] == 'tabcontentafter')
                        {
                            res.contentafter = it;
                        }
                    }
                }
            }
        }
        return res;
    }
   
    this.ParseSectionContent = function(section, el, node, transpBlockParent, transpBlockSection)
    {
        if(!el)
            el = section;
            
        if(!node)
            node = el.container;
        
        top:
        for (var i = 0; i < node.childNodes.length; i++)
        {
            var it = node.childNodes[i];
            if(it.nodeType == 1)
            {
                var obj = new Object();
                obj.transpBlockParent = transpBlockParent; // those blocks allows to ommit them inside the ccontrols sctructure (if the blocks necessary for infrastructure)
                obj.transpBlockSection = transpBlockSection;
                this.ParseCControl(it, section, el, obj);
                if(obj.cancelParsing)
                    break top;
            }
        }
    }

    this.addControlFromTemplate = function (parentCControl, templateCControl, elementNameInCManager, dataToBind, suppressElementAutoAppearing, suppressBinding)
    {
        // suppressBinding - sometimes it might be more suitable in case of using manual binding (due to big amount of elements to parse)
        var el = templateCControl.container.cloneNode(true);
        el.cobject = null;

        if (dataToBind && !suppressBinding)
            mbi.tools.bindHtmlControl(el, dataToBind);

        this.InsertCControl(parentCControl, el, null, elementNameInCManager);

        if (!suppressBinding)
        {
            mbi.extensions.manageInputs(el);
        }

        el.cobject.data = dataToBind;

        if (!suppressElementAutoAppearing)
            el.style.display = '';

        return el.cobject;
    }
    this.InsertCControl = function(parentCOrHtmlControl, htmlElement, htmlElementBefore, elementNameInCManager)
    {
        var parentControl = typeof(parentCOrHtmlControl) == 'object' && parentCOrHtmlControl.cc ? parentCOrHtmlControl : mbi.cmanager.GetParentCObject(parentCOrHtmlControl);
        var parentHtmlControl = parentCOrHtmlControl.container ? parentCOrHtmlControl.container : parentCOrHtmlControl;
        
        if(!htmlElementBefore)
        {
            var htmlElementBefore = parentControl.clearer;
            if(!htmlElementBefore)
            {
                var items = Extensions.GetChildNodes(parentHtmlControl);
                if(items.length > 0 && items[items.length - 1].className == 'cl')
                {
                    htmlElementBefore = items[items.length - 1];
                }
                if(!htmlElementBefore)
                {
                    if(parentControl.params.autoheight)
                    {
                        var el = document.createElement('div');
                        el.className = 'cl';
                        parentHtmlControl.insertBefore(el, null);
                        htmlElementBefore = el;
                    }
                }
                parentControl.clearer = htmlElementBefore;
            }
        }
        parentHtmlControl.insertBefore(htmlElement, htmlElementBefore || null);
        htmlElement.setAttribute('cmanager', elementNameInCManager ? elementNameInCManager : htmlElement.getAttribute('ctemplate'));
        htmlElement.removeAttribute('ctemplate');

        var tag = null;
        if(htmlElement.cobject)
        {
            tag = htmlElement.cobject.tag;
            this.RemoveControl(htmlElement.cobject, false);
        }
        var obj = this.ParseCControl(htmlElement, parentControl.section, parentControl, null);
        obj.tag = tag;
        htmlElement.cobject = obj;
        if(htmlElementBefore && htmlElementBefore.cobject && elementNameInCManager.indexOf('@') == 0) // collection
        {
            this.ReorderControlInCollection(parentControl.controls[elementNameInCManager.replace('@', '')], obj, htmlElementBefore.cobject);
        }
        return obj;
        
    }
    
    this.ReorderControlInCollection = function(parentCollection, objToReorder, objToReorderBefore)
    {
        var k = -1;
        var n = -1;
        
        if(typeof objToReorderBefore == 'number')
            n = objToReorderBefore;
        
        for (var i = 0; i < parentCollection.length; i++)
        {
            var it = parentCollection[i];
            if(it == objToReorder)
                k = i;
            else if(n < 0 && it == objToReorderBefore)
                n = i;
        }
        if(k >=0 && n >= 0)
        {
            parentCollection.splice(k, 1);
            var k = k < n ? n - 1 : n;
            parentCollection.splice(k, 0, objToReorder);
            if(objToReorder.container)
            {
                var el = k + 1 < parentCollection.length ? parentCollection[k + 1] : null;
                if(el)
                    el = el.container;
                objToReorder.container.parentNode.insertBefore(objToReorder.container, el);
            }
        }
    }
    this.tmpGetTransp = function (el)
    {
        var attr = el.getAttribute ? el.getAttribute('cmanager') : null;
        if (attr && attr.indexOf('transp-block-end') != -1)
        {
            return el;
        }
        else
        {
            for (var i = 0; i < el.childNodes.length; i++)
            {
                var el1 = this.tmpGetTransp(el.childNodes[i]);
                if (el1)
                    return el1;
            }
        }
        return null;
    }
    this.ParseCControl = function (node, section, el, paramsEx)
    {
        if (!paramsEx)
            paramsEx = new Object();

        var attr = node.getAttribute('cmanager');
        var bIsTemplate = false;
        if (!attr)
        {
            bIsTemplate = true;
            attr = node.getAttribute('ctemplate');
        }

        if (attr)
        {
            var matches = attr.match(/(\[[^\]]*\])|([^:]*)/g);
            var params = new Array();
            var customParams = new Object();
            for (var i = 0; i < matches.length; i++)
            {
                var mtch = matches[i];
                if (mtch)
                {
                    if (mtch.indexOf('[') == 0)
                    {
                        mtch = mtch.substr(1, mtch.length - 2);
                        var prms = mtch.split(';');
                        for (var j = 0; j < prms.length; j++)
                        {
                            var pr = prms[j];
                            if (pr)
                            {
                                var p = pr.split('=');
                                if (p[0])
                                {
                                    customParams[p[0]] = p.length > 1 ? p[1] : true;
                                }
                            }
                        }
                    }
                    else params.push(mtch);
                }
            }

            var control = null;
            if (node.cobject) // tmp
            {
                if (params.exists('transp-block'))// || params.exists('transp-block-end'))
                {
                    var elTrEnd = this.tmpGetTransp(node);
                    if (elTrEnd)
                    {
                        for (var iii = 0; iii < elTrEnd.childNodes.length; iii++)
                        {
                            var iiit = elTrEnd.childNodes[iii];
                            if (iiit.getAttribute)
                            {
                                if (iiit.cobject)
                                {
                                    iiit.cobject.parent = el;
                                    if (!iiit.cobject.parent.cc[iiit.cobject.name])
                                        iiit.cobject.parent.cc[iiit.cobject.name] = iiit.cobject;
                                }
                                this.ParseCControl(iiit, section, el, null);
                            }
                        }
                    }
                }
                else
                {


                    control = node.cobject;

                    if (!section)
                    //if(paramsEx && paramsEx.transpBlockParentEnd)
                    //    section = paramsEx.transpBlockSection;
                    //else
                        section = control;

                    /*if(paramsEx && paramsEx.transpBlockParentEnd)
                    {
                    control.parent = paramsEx.transpBlockParent;
                    paramsEx.transpBlockParentEnd = null;
                    }
                    else*/
                    if (!control.parent)
                    {
                        if (attr.indexOf(':') == 0)
                            control.parent = section;
                        else
                            control.parent = el;

                        if (control.parent && !control.parent.cc[control.name])
                            control.parent.cc[control.name] = control;
                    }
                    control.section = section;

                }
            }
            else
            {
                control = node.cobject || new Object();

                if (!section)
                    section = control;

                control.section = section;
                control.container = node;
                control.c = node;
                control.controls = new Object();
                control.cc = control.controls;
                control.templates = new Object();
                control.parent = el;
                control.show = this.ShowElement;
                control.showex = this.ShowElementEx;
                control.hide = this.HideElement;
                control.removeChildren = this.RemoveChildren;
                control.gettext = this.GetElementInnerText;
                control.settext = this.SetElementInnerText;

                control.setenable = this.SetElementEnabled;
                control.isenabled = this.GetElementEnabled;

                control.params = customParams;

                control.tag = control.tag || node.getAttribute('ctag') || '';

                var currCObject = control.container.cobject;
                control.container.cobject = control;

                var sName = '';
                var pElement = null;
                if (params.length == 0)
                {
                    sName = GGenerateGuid();
                    pElement = el;
                }
                else // global (with ':')
                {
                    if (params.length > 0 && attr.indexOf('::') != 0)
                    {
                        sName = params[0];
                        params.splice(0, 1);
                    }
                    else
                    {
                        sName = GGenerateGuid();
                    }

                    if (attr.indexOf(':') == 0)
                        pElement = section;
                    else
                        pElement = el;
                }
                /*else
                {
                pElement = el;
                sName = params.length > 0 ? params[0] : GGenerateGuid();
                }*/

                if (sName.indexOf('@') == 0) // one in collection : not possible for templates
                {
                    sName = sName.replace('@', '');
                    if (bIsTemplate)
                    {
                        alert('CCollections not supported for templates.');
                        return null;
                    }
                    if (!pElement.controls[sName])
                        pElement.controls[sName] = new Array();

                    control.parentCollection = pElement.controls[sName];
                    pElement.controls[sName].push(control);
                    //control.container.cobject = control;
                }
                else
                {
                    if (pElement)
                    {
                        if (bIsTemplate)
                            pElement.templates[sName] = control;
                        else
                        {
                            var bIsRadio = false;
                            if (control.c.tagName == 'INPUT' &&
                                control.c.type == 'radio')
                            {
                                bIsRadio = true;
                            }
                            else
                            {
                                if (control.c.tagName == 'SPAN')
                                {
                                    var els = mbi.extensions.GetChildNodes(control.c, 'INPUT');
                                    if (els.length == 1 && els[0].type == 'radio')
                                    {
                                        bIsRadio = true;
                                    }
                                }
                            }

                            if (!bIsRadio)
                            {
                                pElement.controls[sName] = control;
                            }
                            else
                            {
                                control.core = els[0];
                                control.getValue = this.GetRadioValue;
                                control.setValue = this.SetRadioValue;

                                control.group = new Array();

                                var _c = pElement.controls[sName];
                                if (_c)
                                {
                                    if (!_c.group)
                                    {
                                        _c.group = control.group;
                                        control.group.push(_c);
                                    }
                                    else
                                    {
                                        control.group = _c.group;
                                    }

                                    pElement.controls[sName] = control;
                                }
                                else pElement.controls[sName] = control;

                                control.group.push(control);
                            }
                        }
                    }
                }

                control.name = sName;

                if (control.c.tagName == 'INPUT' &&
                        control.c.type == 'text' || control.c.tagName == 'TEXTAREA')
                {
                    if (!control.initialized)
                        this.initializeInput(control);
                }
                else if (control.c.tagName == 'INPUT' &&
                        control.c.type == 'check')
                {
                    control.core = control.c;
                    control.getValue = this.GetCheckboxValue;
                    control.setValue = this.SetCheckboxValue;
                }
                else if (control.c.tagName == 'SELECT')
                {
                    control.getValue = this.GetDropdownValue;
                    control.setValue = this.SetDropdownValue;
                }
                else
                {
                    var els = mbi.extensions.GetChildNodes(control.c, 'INPUT');
                    if (els.length == 1 && els[0].type == 'checkbox')
                    {
                        control.core = els[0];
                        control.getValue = this.GetCheckboxValue;
                        control.setValue = this.SetCheckboxValue;
                    }
                    else if (control.params && control.params.type)
                    {
                        // custom ccontrol initialization
                    }
                    else
                    {
                        if (control.c.getValue)
                            control.getValue = function () { return control.c.getValue.call(control.c); }
                        if (control.c.setValue)
                            control.setValue = function (value) { control.c.setValue.call(control.c, value); }
                    }
                }

                control.initialized = true;

                for (var j = 0; j < params.length; j++)
                {
                    var prm = params[j];
                    if (prm == 'stop') // stop parsing children
                    {
                        if (paramsEx)
                            paramsEx.cancelParsing = true;
                        return control;
                    }
                    else if (prm == 'editwithparent') // autoeditting with section
                    {
                    }
                    else if (prm == 'auto')
                    {
                        var rx = /{CommonAdd:{0,}([^}]*)}/;
                        var match = rx.exec(control.container.innerHTML);
                        if (match)
                        {
                            var str = match[1];
                            var repl = '{CommonAdd}';
                            if (!str)
                            {
                                str = 'add';
                            }
                            else
                            {
                                repl = '{CommonAdd:' + str + '}';
                            }

                            control.container.innerHTML = control.container.innerHTML.replace(repl, CManager.CommonAddTemplate.replace('$1', str));
                        }
                        control.container.innerHTML = control.container.innerHTML.replace('{CommonApplyCancel}', CManager.CommonApplyCancelTemplate);
                        control.container.innerHTML = control.container.innerHTML.replace('{CommonEditDelete}', CManager.CommonEditDeleteTemplate);
                        control.container.innerHTML = control.container.innerHTML.replace('{CommonEdit}', CManager.CommonEditTemplate);
                        control.container.innerHTML = control.container.innerHTML.replace('{CommonSectionEdit}', CManager.CommonSectionEditTemplate);
                        //control.container.cobject = control;
                    }
                    else if (prm == 'show')
                    {
                        control.container.style.display = '';
                    }
                    else if (prm == 'visible')
                    {
                        control.container.style.visibility = '';
                    }
                    /*else if(prm == 'object')
                    {
                    control.container.cobject = control;
                    }*/
                    else if (prm == 'telerik')
                    {
                        control.telerik = this.GetTelerik;
                        control.container.cobject = control;
                        control.getValue = this.GetTelerikValue;
                        control.setValue = this.SetTelerikValue;
                    }
                    else if (prm == 'multi')
                    {
                        control.multilist = true;
                    }
                    else if (prm.indexOf('group-') == 0 && prm.length > 6)
                    {
                        var sGroup = prm.substr(6);
                        if (!this.groups[sGroup])
                            this.groups[sGroup] = new Array();

                        this.groups[sGroup].push(control);
                    }
                    else if (prm == 'command')
                    {
                        control.command = sName;
                    }
                    else if (prm == 'check' || prm == 'chk')
                    {
                        var inputs = control.container.getElementsByTagName('input');
                        if (inputs.length > 0)
                            control.checkbox = inputs[0];
                        else
                            control.checkbox = control.container;
                    }
                    else if (prm == 'transp')
                    {
                        paramsEx.transpBlockParent = control.parent;
                        paramsEx.transpBlockSection = control.section;
                        paramsEx.transpBlockParentEnd = true;
                    }
                    else if (prm == 'transp-block')
                    {
                        if (paramsEx.transpBlockParent)
                        {
                            alert('Nested transparent blocks are not supported!');
                        }
                        else
                        {

                            paramsEx.transpBlockParent = control.parent;
                            paramsEx.transpBlockSection = control.section;
                            //paramsEx.currentIsTranspBlock = true;
                        }
                    }
                    else if (prm == 'transp-block-end')
                    {
                        paramsEx.transpBlockParentEnd = true;
                    }
                    else
                    {
                        // custom params parsing
                        if (!control.params)
                            control.params = new Object();

                    }
                }

                if (paramsEx.transpBlockParentEnd)
                {
                    this.ParseSectionContent(paramsEx.transpBlockSection, paramsEx.transpBlockParent, node);
                }
                else if (!control.telerik)
                {
                    if (paramsEx.transpBlockSection && currCObject)
                        control.container.cobject = currCObject;

                    this.ParseSectionContent(paramsEx.transpBlockSection || section, control, null, paramsEx.transpBlockParent, paramsEx.transpBlockSection);
                }
            }
            return control;
        }
        else
        {
            this.ParseSectionContent(section, el, node);
        }

        return null;
    }
    
    this.RemoveControl = function(control, removeHtmlElement)
    {
        if(control.parentCollection)
        {
            for (var i = 0; i < control.parentCollection.length; i++)
            {
                var it = control.parentCollection[i];
                if(it == control)
                {
                    control.parentCollection.splice(i, 1);
                    break;
                }
            }
        }
        else
        {
            for (var n in control.parent.controls)
            {
                var it = control.parent.controls[n];
                if(it == control)
                {
                    control.parent.controls[n] = null;
                    break;
                }
            }
        }
        if(removeHtmlElement != false)
            RemoveNodeEx(control.container);
        control = null;
    }
    
    this.cControlsStorage = null;
    this.controls = new Object();
    this.cc = this.controls;
    this.RegisterControl = function(htmlElement)
    {
        if(!this.cControlsStorage)
            this.cControlsStorage = new Array();
            
        var obj = this.cControlsStorage.findObject(htmlElement);
        if(!obj)
        {
            obj = new Object();
            obj.element = htmlElement;
            obj.ccontrol = this.ParseCControl(htmlElement, null, null, null);
            this.cControlsStorage.push(obj);
            this.controls[obj.ccontrol.name] = obj.ccontrol;
        }
        return obj.ccontrol;
    }

    this.getData = function (oCObject)
    {
        var result = new Object();

        if (oCObject.data && oCObject.data._id)
            result._id = oCObject.data._id;

        if (oCObject.data)
            for (var n in oCObject.data)
            {
                if (n.indexOf('___') == 0)
                    result[n] = oCObject.data[n];
            }

        for (var n in oCObject.cc)
        {
            var c = oCObject.cc[n];
            if (c.params && c.params.data != undefined && c.params.data != 'r')
            {
                if (c.params.template || c.cc.items)
                {
                    var arr = new Array();
                    result[n] = arr;
                    if (c.cc.items)
                    {
                        for (var i = 0; i < c.cc.items.length; i++)
                        {
                            arr.push(mbi.cmanager.getData(c.cc.items[i]));
                        }
                    }
                }
                else if (c.getValue)
                {
                    result[n] = c.getValue();
                }
                else if (c.c.getValue)
                {
                    result[n] = c.c.getValue();
                }
            }
        }
        return result;
    }

    this.bindDataControl = function (oCObject, data)
    {
        oCObject.data = data;
        for (var n in oCObject.cc)
        {
            var c = oCObject.cc[n];
            c.dirty = false;
            if (c.params && c.params.data != undefined)
            {
                if (!data)
                {
                    // :todo here is default declaration value calculation (in case of dynamic value)
                    if (c.setValue)
                    {
                        if(c.setValue.length == 2)
                            c.setValue(c.params['default'], true);
                        else
                            c.setValue(c.params['default']);
                    }
                    else if (c.params.template)
                        c.removeChildren();
                    else
                        c.settext(c.params['default']);
                }
                else
                {
                    var d = data[n];
                    var bFound = false;
                    if (!data.hasOwnProperty(n))
                    {
                        for (var z in data)
                        {
                            if (z.toLowerCase() == n.toLowerCase())
                            {
                                d = data[z];
                                bFound = true;
                                break;
                            }
                        }
                    }
                    else bFound = true;
                    if (!bFound)
                        alert('Value of field [' + n + '] does not exist in the datasource.');
                    else if (d && (d.length || d.length == 0) && typeof (d) != 'string' || !c.setValue && c.params.template) // if this is array
                    {
                        c.removeChildren();
                        if (c.params.template)
                        {
                            for (var j = 0; j < d.length; j++)
                            {
                                var _d = d[j];
                                var _c = mbi.cmanager.addControlFromTemplate(c, c.parent.templates[c.params.template], '@items', _d);
                                mbi.cmanager.bindDataControl(_c, _d);
                            }
                        }
                    }
                    else if (!c.setValue)
                    {
                        if (c.settext)
                            c.settext(d && d.hasOwnProperty('value') ? d.value : d);
                        else
                            alert('Control [' + n + '] has no value setter!');
                    }
                    else
                    {
                        if (d && d.max && (c.c.tagName == 'TEXTAREA' || c.c.tagName == 'INPUT' && c.c.type == 'text'))
                            c.c.maxLength = d.max;

                        c.setValue(d && d.hasOwnProperty('value') ? d.value : d);
                    }
                }
            }
        }
    }
    this.fillObjectWithData = function (data, oCObject)
    {

    }

    this.commands = new Object();
    this.commands['list-item-add'] = function (csender)
    {
        if (csender.params.list)
        {
            var clist = csender.parent.cc[csender.params.list];
            if (clist && clist.params.template)
            {
                var _c = mbi.cmanager.addControlFromTemplate(clist, clist.parent.templates[clist.params.template], '@items', null);
                mbi.cmanager.bindDataControl(_c, null);
            }
        }
    }

    this.commands['list-item-remove'] = function (sender)
    {
        var c = sender.tagName ? (sender.cobject ? sender.cobject.parent : mbi.cmanager.GetParentCObject(sender)) : sender.parent;
        mbi.cmanager.RemoveControl(c);
        return false;
    }
    this.commands['list-item-up'] = function (sender)
    {
        var c = sender.tagName ? (sender.cobject ? sender.cobject.parent : mbi.cmanager.GetParentCObject(sender)) : sender.parent;
        for (var i = 0; i < c.parentCollection.length; i++)
        {
            var it = c.parentCollection[i];
            if (it == c)
            {
                if (i > 0)
                {
                    var c0 = c.parentCollection[i - 1];
                    mbi.cmanager.ReorderControlInCollection(c.parentCollection, c, c0);
                    return false;
                }
            }
        }

        return false;
    }
    this.commands['list-item-down'] = function (sender)
    {
        var c = sender.tagName ? (sender.cobject ? sender.cobject.parent : mbi.cmanager.GetParentCObject(sender)) : sender.parent;
        for (var i = 0; i < c.parentCollection.length; i++)
        {
            var it = c.parentCollection[i];
            if (it == c)
            {
                if (i < c.parentCollection.length - 1)
                {
                    var c0 = c.parentCollection[i + 1];
                    mbi.cmanager.ReorderControlInCollection(c.parentCollection, c0, c);
                    return false;
                }
            }
        }

        return false;
    }
}
/*ControlsManager.prototype.removeCssClass = function (sClass)
{
    mbi.extensions.RemoveCssClass(this.c, sClass);
}
ControlsManager.prototype.addCssClass = function (sClass)
{
    mbi.extensions.AddCssClass(this.c, sClass);
}
ControlsManager.prototype.hasCssClass = function (sClass)
{
    mbi.extensions.HasCssClass(this.c, sClass);
}*/
var CManager = new ControlsManager();
mbi.cmanager = CManager;




function PressPageControlsManager()
{
    this.commands = new Object();
    
    this.OnTabBeforeUnselected = function(tab)
    {
        if(tab.mode == 2)
            if(CManager.controls.player)
                CManager.controls.player.tag.hide();
    }
    this.OnTabBeforeSelected = function(tab)
    {
    }
    this.OnTabFirstTimeSelected = function (tab) {

        if (tab.mode == 1)//about
        {
            this.BindLinksSection();
            this.BindPhotosSection();
        }
        else if (tab.mode == 3) {
            this.BindVideosSection();
        }
        else if (tab.mode == 4) {
            this.BindNewsSection();
            this.BindRssSection();
        }
        else if (tab.mode == 5) {
            this.BindCalendarSection();
        }
    }
    this.OnCommandRequest = function(ccontrol, command, e)
    {
        var iSectionID = ccontrol.section.id;
        var h = this.commands[iSectionID];
        var result = null;
        if(h)
        {
            var h2 = h[command];
            if(h2)
            {
                result = h2(ccontrol, command, e);
            }
        }
        else if(ccontrol && ccontrol.section && ccontrol.section.tag && ccontrol.section.tag.OnCommandRequest)
        {
            result = ccontrol.section.tag.OnCommandRequest(ccontrol, command, e);
        }
        
        if(result == false)
            e.returnValue = false;
        return result;
    }
    
    /*bindings*/
    
    this.BindLinksSection = function()
    {
        PageMethods.GetPressPageLinks(GetPageVariable('PageUID'), function(pmInfo)
        {             
            for(var i=0; i < pmInfo.Result.length; i++)
            {
                PressPageCManager.AddLink(pmInfo.Result[i][0], pmInfo.Result[i][1], pmInfo.Result[i][2]);
            }
        }, gErrorHandler);
    }

    this.BindPhotosSection = function () {

        PageMethods.GetPressPagePhotos(GetPageVariable('PageUID'), function (pmInfo) {
            var section = CManager.tabs['1'].sections[12];

            var SliderControl = CManager.tabs['1'].sections[12].controls.rotator.container.Object;

            // section.tag = new SliderControlManager(section);

            for (var i = 0; i < pmInfo.Result.length; i++) {
                SliderControl.AddPhoto(pmInfo.Result[i][0], pmInfo.Result[i][1], pmInfo.Result[i][2], pmInfo.Result[i][4], pmInfo.Result[i][9], pmInfo.Result[i][10], pmInfo.Result[i][3], pmInfo.Result[i][5], pmInfo.Result[i][7], pmInfo.Result[i][8], false);
            }

            SliderControl.SetSettings(6000, 200, true, 5, '#aaaaaa'); //(slideSpeed, fadeSpeed, showBorder, borderSize, borderColor)
            SliderControl.Play();

        }); //, gErrorHandler);

        //            ScriptManager.RegisterStartupScript(this, this.GetType(), this.ClientID,
        //        string.Format(" document.getElementById('{0}').Object = new PhotosView('{0}','{1}','{2}', '{3}', '{4}'); ",
        //        this.ClientID, this.cpForeColor.ClientID, this.cpBackColor.ClientID, this.cpRotatorBackColor.ClientID, this.cpBorderColor.ClientID), true);
    }

    this.BindVideosSection = function () {
        PageMethods.GetPressPageVideos(GetPageVariable('PageUID'), function (pmInfo) {

            var section = CManager.tabs['3'].sections[15];
            section.tag = new PressPageVideosManager(section, pmInfo.Result);
        }, gErrorHandler);
    }

    this.BindNewsSection = function () {

        var NewsObject = CManager.tabs['4'].sections[16].controls.news.container.Object;

        NewsObject.ClearNews();

        PageMethods.GetPressPageNews(GetV('PageUID'), function (pmInfo) {
            for (var i = 0; i < pmInfo.Result.length; i++) {
                NewsObject.AddNews(pmInfo.Result[i][0], pmInfo.Result[i][3], pmInfo.Result[i][4]);
            }

        }); //, gErrorHandler);
    }

    this.BindRssSection = function () {

        var RssObject = CManager.tabs['4'].sections[17].controls.rss.container.Object; ;

        RssObject.ClearRss();

        PageMethods.GetPressPageRss(GetV('PageUID'), function (pmInfo) {
            if (pmInfo.Error && pmInfo.Error != '')
                alert('Rss or Feed channel temporary unavailable or invalid.');

            for (var i = 0; i < pmInfo.Result.length; i++) {
                // params = (RssID, Title, RssLink, RssData)
                var Item = pmInfo.Result[i];
                RssObject.AddRss(Item[0][0], Item[0][5], Item[0][3], Item[1]);
            }

        }); //, gErrorHandler);
    }

    this.BindCalendarSection = function () {

        //alert(CManager.tabs['5'].sections[18].controls.calendar.container.Object);
        var CalendarObject = CManager.tabs['5'].sections[18].controls.calendar.container.Object;

        CalendarObject.ClearEvents();

        PageMethods.GetPressPageEvents(GetV('PageUID'), function (pmInfo) {
            for (var i = 0; i < pmInfo.Result.length; i++) {
                //params = (EventID, Date, Time, Venue, CityCountry, Description, IsFuture)
                var Item = pmInfo.Result[i];
                CalendarObject.AddEvent(pmInfo.Result[i][0], pmInfo.Result[i][1], pmInfo.Result[i][2], pmInfo.Result[i][3], pmInfo.Result[i][4], pmInfo.Result[i][5], pmInfo.Result[i][6], pmInfo.Result[i][7]);
            }

        }); //, gErrorHandler);
    }
    
    /* presspage style settings */
    this.InitializeSettingsBlock = function(sContainerClientID)
    {
        var p = $get(sContainerClientID);
        this.settingsBlock = CManager.ParseCControl(p);
        
        this.settingsBlock.controls.openerbutton.container.onclick = function(e){PressPageCManager.SettingsBlockOpenClick(e);}
        this.settingsBlock.controls.savebutton.container.onclick = function(e){PressPageCManager.SettingsBlockSaveClick(e);}
        this.settingsBlock.controls.cancelbutton.container.onclick = function(e){PressPageCManager.SettingsBlockCancelClick(e);}
    }
    this.SettingsBlockOpenClick = function(e)
    {
        if(CManager.controls.player)
            CManager.controls.player.tag.hide();
            
        var section = this.settingsBlock;
        
        section.isVisible = true;
        CManager.controls.designsettings.tag.initialize();
        
        if(section.initialValue)
        {
            CManager.controls.designsettings.tag.setValue(CloneObject(section.initialValue));
        }
        else
        {
            section.initialValue = CloneObject(CManager.controls.designsettings.tag.getValue());
        }
        
        //section.currentValue = CloneObject(section.initialValue);
        
        actM.addAction(new action(this.settingsBlock.container, 0, -this.settingsBlock.container.clientHeight, '{0}.style.bottom="{1}px"', 200, 100, 
            function(el){el.className = 'GSlidingPanel GSlidingPanelExp';
                actM.addAction(new action(el, -el.clientHeight, 0, '{0}.style.bottom="{1}px"', 500, -100));
            }));
    }
    this.SettingsBlockSaveClick = function(e)
    {
        /*if(!CManager.controls.designsettings.tag.isDirty())
        {
            this.SettingsBlockClose();
            return;
        }*/
        
        var params = new Array();
        var v = CManager.controls.designsettings.tag.getValue();
        for(var n in v)
        {
            if(this.settingsBlock.initialValue[n] != v[n])
                params.push([0, 'settings', n, v[n]]);
        }
        
        if(params.length > 0)
            PageMethods.ProcessPressPageItems(params, function(res){PressPageCManager.SettingsBlockSaveClickOk(res);}, null);
    }
    this.SettingsBlockSaveClickOk = function(pm)
    {
        if(!pm.IsLogged)
        {
            showLogin();
            return;
        }
        
        this.SettingsBlockClose();
    }
    this.SettingsBlockCancelClick = function(e)
    {
        //var value = section.initialValue;
        CManager.controls.designsettings.tag.applyValue(this.settingsBlock.initialValue);
        
        this.SettingsBlockClose();
    }
    this.SettingsBlockClose = function()
    {
        this.settingsBlock.isVisible = false;

        actM.addAction(new action(this.settingsBlock.container, 0, -this.settingsBlock.container.clientHeight, '{0}.style.bottom="{1}px"', 500, 100, 
            function(el){
                el.className = 'GSlidingPanel';
                CManager.controls.designsettings.tag.dispose();
                actM.addAction(new action(el, -el.clientHeight, 0, '{0}.style.bottom="{1}px"', 200, -100));
            }));
        
    }
    //-----playlist settings
    this.InitializePlaylistSettingsBlock = function(sContainerClientID)
    {
        var p = $get(sContainerClientID);
        this.settingsBlockPlaylist = CManager.ParseCControl(p);
        
        var cc = this.settingsBlockPlaylist.controls;
        cc.openerbutton.container.onclick = function(e){PressPageCManager.SettingsBlockPlaylistOpenClick(e);return false;}
        cc.savebutton.container.onclick = function(e){PressPageCManager.SettingsBlockPlaylistSaveClick(e);return false;}
        cc.cancelbutton.container.onclick = function(e){PressPageCManager.SettingsBlockPlaylistCancelClick(e);return false;}
        
        cc.content.controls.chkdesignpresspage.checkbox.onclick = function(e){PressPageCManager.SettingsBlockPlaylistDesignModeClick(e);}
        cc.content.controls.chkdesignplaylist.checkbox.onclick = function(e){PressPageCManager.SettingsBlockPlaylistDesignModeClick(e);}
        
        this.settingsBlockPlaylist._currentViewMode = cc.content.controls.chkdesignpresspage.checkbox.checked ? false : true;
    }
    this.SettingsBlockPlaylistOpenClick = function(e)
    {
        var section = this.settingsBlockPlaylist;
        
        section.isVisible = true;
        CManager.controls.designsettings.tag.initialize();
        
        var value = null;
        if(cc.content.controls.chkdesignpresspage.checkbox.checked)
        {
            var v = new Object();
            var pp = this.settingsBlockPlaylist.params;
            
            v.bckcolor = pp.ppbckcolor;
            v.repeat = pp.pprepeat;
            v.theme = pp.pptheme;
            v.position = pp.ppposition;
            v.bckimage = pp.ppbckimage;
            
            value = v;
        }
        else
        {
            value = CloneObject(CManager.controls.designsettings.tag.getValue());
        }
        
        value.__mode = cc.content.controls.chkdesignpresspage.checkbox.checked;
        
        section.initialValue = value;
        CManager.controls.designsettings.tag.setValue(CloneObject(value));
        
        CManager.cc.designsettings.tag.setEnabled(section.cc.content.controls.chkdesignplaylist.checkbox.checked);
        
        //section.currentValue = CloneObject(section.initialValue);
        
        actM.addAction(new action(this.settingsBlockPlaylist.container, 0, -this.settingsBlockPlaylist.container.clientHeight, '{0}.style.bottom="{1}px"', 200, 100, 
            function(el){el.className = 'GSlidingPanel GSlidingPanelExp';
                actM.addAction(new action(el, -el.clientHeight, 0, '{0}.style.bottom="{1}px"', 500, -100));
            }));
    }
    this.SettingsBlockPlaylistSaveClick = function(e)
    {
        /*if(!CManager.controls.designsettings.tag.isDirty())
        {
            this.SettingsBlockClose();
            return;
        }*/
        
        var mode = !this.settingsBlockPlaylist.controls.content.controls.chkdesignpresspage.checkbox.checked;
        var designParams = null;
        var v = null;
        if(mode)
        {
            designParams = new Array();
            v = CManager.controls.designsettings.tag.getValue();
            for(var n in v)
            {
                //if(this.settingsBlockPlaylist.initialValue[n] != v[n])
                designParams.push([n, '' + v[n]]);
            }
        }
        
        PageMethods.ProcessPlaylistSettings(GPlaylistUID, mode, designParams, function(res, context){PressPageCManager.SettingsBlockPlaylistSaveClickOk(res, context);}, function(){}, v ? CloneObject(v) : null);
    }
    this.SettingsBlockPlaylistSaveClickOk = function(pm, context)
    {
        if(!pm.IsLogged)
        {
            showLogin(function(){PressPageCManager.SettingsBlockPlaylistSaveClick();});
            return;
        }
        if(context)
        {
            context.bckimage = pm.Result[1];
            this.settingsBlockPlaylist.initialValue = context;
        }
        this.SettingsBlockPlaylistClose();
    }
    this.SettingsBlockPlaylistCancelClick = function(e)
    {
        cc.content.controls.chkdesignpresspage.checkbox.checked = this.settingsBlockPlaylist.initialValue.__mode;
        cc.content.controls.chkdesignplaylist.checkbox.checked = !cc.content.controls.chkdesignpresspage.checkbox.checked;
        
        CManager.controls.designsettings.tag.applyValue(this.settingsBlockPlaylist.initialValue);
        
        this.SettingsBlockPlaylistClose();
    }
    this.SettingsBlockPlaylistClose = function()
    {
        this.settingsBlockPlaylist.isVisible = false;

        actM.addAction(new action(this.settingsBlockPlaylist.container, 0, -this.settingsBlockPlaylist.container.clientHeight, '{0}.style.bottom="{1}px"', 500, 100, 
            function(el){
                el.className = 'GSlidingPanel';
                CManager.controls.designsettings.tag.dispose();
                actM.addAction(new action(el, -el.clientHeight, 0, '{0}.style.bottom="{1}px"', 200, -100));
            }));
        
    }
    this.SettingsBlockPlaylistDesignModeClick = function(e)
    {
        var mode = !this.settingsBlockPlaylist.cc.content.cc.chkdesignpresspage.checkbox.checked;
        if(mode != this.settingsBlockPlaylist._currentViewMode)
        {
            this.settingsBlockPlaylist._currentViewMode = mode;
            
            CManager.cc.designsettings.tag.setEnabled(mode);
            if(mode)//playlist
            {
                CManager.controls.designsettings.tag.applyValue(CManager.controls.designsettings.tag.getValue());
            }
            else
            {
                var v = new Object();
                var pp = this.settingsBlockPlaylist.params;
                
                v.bckcolor = pp.ppbckcolor;
                v.repeat = pp.pprepeat;
                v.theme = pp.pptheme;
                v.position = pp.ppposition;
                v.bckimage = pp.ppbckimage;
                
                CManager.controls.designsettings.tag.applyValue(v);
            }
        }
    }
    /* Begin LINKS */

    this.iconLinks = ['youtube.com', 'myspace.com', 'rssfeed.com', 'twitter.com', 'facebook.com', 'lastfm.com', 'flickr.com', 'linkedin.com'];

    this.AddLink = function(linkId, linkTitle, linkAddress, insertBeforeElement)
    {   // validation must be processed before this (if necessary)
        var section = CManager.tabs['1'].sections[13];
        var cc = section.controls;
        
        var el = section.templates.item.container.cloneNode(true);
        el.style.display = '';
        
        var sIconClassName = '';
        for(var i = 0; i < this.iconLinks.length; i++)
        {
            if(linkAddress.toString().toLocaleLowerCase().indexOf(this.iconLinks[i]) > -1)
            {
                sIconClassName = this.iconLinks[i].replace('.', '_');
                break;
            }
        }
        el.innerHTML = el.innerHTML.replace('{0}', linkId).replace('{1}', (linkAddress.indexOf('http') == 0 ? '' : 'http://') + linkAddress).replace(sIconClassName ? '{3}' : '{2}', !linkTitle && !sIconClassName ? linkAddress : linkTitle).replace(sIconClassName ? '{2}' : '{3}', '').replace('{4}', sIconClassName);
        if(sIconClassName)
        {
            el.className = 'icon';
        }
        var elBefore = insertBeforeElement;
        if(!elBefore || elBefore.className != el.className)
        {
            for (var i = 0; i < cc.core.container.childNodes.length; i++)
            {
                var it = cc.core.container.childNodes[i];
                if(it.nodeType == 1)
                {
                    if((el.className || '') == '' && it.className == 'icon')
                        continue;
                    else if(it.className != el.className)
                    {
                        elBefore = it;
                        break;
                    }
                }   
            }
        }
                
        var control = CManager.InsertCControl(cc.core, el, elBefore || null, '@items');
        control.id = linkId;
        control.value = new Object();
        control.value.caption = linkTitle;
        control.value.link = linkAddress;
    }

    this.IsEdittingLink = function(section, cancelIfNoChanges)
    {
        var el = section.controls.edit;
        if(el.container.style.display != 'none')
        {
            if(cancelIfNoChanges && el.controls.caption.container.value == el.initialValue.caption && el.controls.link.container.value == el.initialValue.link)
            {
                this.CancelEditLink(section);
                section.controls.add.container.style.display = '';
                return false;
            }
            return true;
        }
        return false;
    }

    this.EditLink = function(ccontrol, section)
    {
        if(!section)
            section = ccontrol.section;
            
        if(this.IsEdittingLink(section, true))
        {
            if(confirm('There were some changes applied. Are you sure you want to cancel them?'))
                this.CancelEditLink(section);            
            else
                return;
        }
        
        var cc = section.controls;
        var el = cc.edit;
        el.referrer = ccontrol; // referenced object, can be empty
        el.controls.caption.container.value = ccontrol ? ccontrol.value.caption : '';
        el.controls.link.container.value = ccontrol ? ccontrol.value.link : '';
        el.initialValue = new Object();
        el.initialValue.caption = el.controls.caption.container.value;
        el.initialValue.link = el.controls.link.container.value;
        
        cc.core.container.insertBefore(el.container, ccontrol ? ccontrol.container : null);
        el.container.style.display = '';
        
        if(!ccontrol)
            cc.add.container.style.display = 'none';
        else
            ccontrol.container.style.display = 'none';
    }

    this.SaveLink = function(control)
    {
        var el = control.section.controls.edit;
        var iID = el.referrer == null ? null : el.referrer.id;
        
        var sCaption = el.controls.caption.container.value;
        var sLink = el.controls.link.container.value.replace(/https{0,1}:\/\//i, '');
        var params = new Array([control.section.id, 'link', iID, sCaption, sLink ]);
        PageMethods.ProcessPressPageItems(params, function(pm, context){ PressPageCManager.SaveLinkOk(pm, context); }, null, [ control, sCaption, sLink ]);
    }
    this.SaveLinkOk = function(pm, context)
    {
        var el = context[0];
        if(!pm.IsLogged)
        {
            showLogin();
            return;
        }
        var section = el.section;
        this.AddLink(pm.Result, context[1], context[2], el.container); 
        
        
        CManager.RemoveControl(el);
        el = null;
        
        section.controls.edit.container.style.display = 'none';
        section.controls.add.container.style.display = '';
    }

    this.CancelEditLink = function(section)
    {
        var el = section.controls.edit;
        
        if(el.referrer)
            el.referrer.container.style.display = '';
                    
        el.container.style.display = 'none';
        section.controls.add.container.style.display = '';
    }
    
    this.DeleteLink = function(control)
    {
        if(confirm('Are you sure you want to delete this link?'))
        {
            var params = new Array([control.section.id, 'link', -control.id]);
            PageMethods.ProcessPressPageItems(params, function(pm, context){ PressPageCManager.DeleteLinkOk(pm, context); }, null, control);
        }
    }
    this.DeleteLinkOk = function(pm, context)
    {
        if(!pm.IsLogged)
        {
            showLogin();
            return;
        }
        CManager.RemoveControl(context);
    }

/* End LINKS */



    





/* begin text*/
    this.EditTextControl = function(control)
    {
        var cc = control.section.controls;
        cc.edit.hide();
        cc.value.hide();
        cc.editor.show();
        cc.editor.container.value = cc.value.gettext();
        cc.editor.initialValue = cc.editor.container.value;
        cc.apply.show();
    }
    this.SaveTextControl = function(control)
    {
        var cc = control.section.controls;
        var value = cc.editor.container.value;
        if(cc.editor.initialValue != value)
        {
            PageMethods.ProcessPressPageItems([[control.section.id, 'text', value ]], 
                function(pm, context){ PressPageCManager.SaveTextControlOk(pm, context); }, null, [control, value] );
        }
        else this.CancelTextControl(control);
    }
    this.SaveTextControlOk = function(pm, context)
    {
        if(!pm.IsLogged)
        {
            showLogin();
            return;
        }
        context[0].section.controls.value.settext(context[1]);
        this.CancelTextControl(context[0]);
    }
    this.CancelTextControl = function(control)
    {
        var cc = control.section.controls;
        cc.edit.show();
        cc.value.show();
        cc.editor.hide();
        cc.apply.hide();
    }
/* end text*/
    this.commands[13] = new Object();
    this.commands[13]['add'] = function(control){PressPageCManager.EditLink(null, control.section);};
    this.commands[13]['edit'] = function(control){PressPageCManager.EditLink(control, null);};
    this.commands[13]['save'] = function(control){PressPageCManager.SaveLink(control);};
    this.commands[13]['cancel'] = function(control){PressPageCManager.CancelEditLink(control.section);};
    this.commands[13]['delete'] = function(control){PressPageCManager.DeleteLink(control);};

    this.commands[10] = new Object();
    this.commands[11] = new Object();
    this.commands[10]['edit'] = function(control){PressPageCManager.EditTextControl(control);};
    this.commands[11]['edit'] = function(control){PressPageCManager.EditTextControl(control);};
    this.commands[10]['save'] = function(control){PressPageCManager.SaveTextControl(control);};
    this.commands[11]['save'] = function(control){PressPageCManager.SaveTextControl(control);};
    this.commands[10]['cancel'] = function(control){PressPageCManager.CancelTextControl(control);};
    this.commands[11]['cancel'] = function(control){PressPageCManager.CancelTextControl(control);};
}

/* Begin NewsControl */

function NewsControl(csectioncontrol) {

    this.AddLink = function (linkId, linkTitle, linkAddress, insertBeforeElement) {   // validation must be processed before this (if necessary)
        var section = CManager.tabs['1'].sections[13];
        var cc = section.controls;

        var el = section.templates.item.container.cloneNode(true);
        el.style.display = '';

        var sIconClassName = '';
        for (var i = 0; i < this.iconLinks.length; i++) {
            if (linkAddress.toString().toLocaleLowerCase().indexOf(this.iconLinks[i]) > -1) {
                sIconClassName = this.iconLinks[i].replace('.', '_');
                break;
            }
        }
        el.innerHTML = el.innerHTML.replace('{0}', linkId).replace('{1}', (linkAddress.indexOf('http') == 0 ? '' : 'http://') + linkAddress).replace(sIconClassName ? '{3}' : '{2}', !linkTitle && !sIconClassName ? linkAddress : linkTitle).replace(sIconClassName ? '{2}' : '{3}', '').replace('{4}', sIconClassName);
        if (sIconClassName) {
            el.className = 'icon';
        }
        var elBefore = insertBeforeElement;
        if (!elBefore || elBefore.className != el.className) {
            for (var i = 0; i < cc.core.container.childNodes.length; i++) {
                var it = cc.core.container.childNodes[i];
                if (it.nodeType == 1) {
                    if ((el.className || '') == '' && it.className == 'icon')
                        continue;
                    else if (it.className != el.className) {
                        elBefore = it;
                        break;
                    }
                }
            }
        }

        var control = CManager.InsertCControl(cc.core, el, elBefore || null, '@items');
        control.id = linkId;
        control.value = new Object();
        control.value.caption = linkTitle;
        control.value.link = linkAddress;
    }

    this.IsEdittingLink = function (section, cancelIfNoChanges) {
        var el = section.controls.edit;
        if (el.container.style.display != 'none') {
            if (cancelIfNoChanges && el.controls.caption.container.value == el.initialValue.caption && el.controls.link.container.value == el.initialValue.link) {
                this.CancelEditLink(section);
                section.controls.add.container.style.display = '';
                return false;
            }
            return true;
        }
        return false;
    }

    this.EditLink = function (ccontrol, section) {
        if (!section)
            section = ccontrol.section;

        if (this.IsEdittingLink(section, true)) {
            if (confirm('There were some changes applied. Are you sure you want to cancel them?'))
                this.CancelEditLink(section);
            else
                return;
        }

        var cc = section.controls;
        var el = cc.edit;
        el.referrer = ccontrol; // referenced object, can be empty
        el.controls.caption.container.value = ccontrol ? ccontrol.value.caption : '';
        el.controls.link.container.value = ccontrol ? ccontrol.value.link : '';
        el.initialValue = new Object();
        el.initialValue.caption = el.controls.caption.container.value;
        el.initialValue.link = el.controls.link.container.value;

        cc.core.container.insertBefore(el.container, ccontrol ? ccontrol.container : null);
        el.container.style.display = '';

        if (!ccontrol)
            cc.add.container.style.display = 'none';
        else
            ccontrol.container.style.display = 'none';
    }

    this.SaveLink = function (control) {
        var el = control.section.controls.edit;
        var iID = el.referrer == null ? null : el.referrer.id;

        var sCaption = el.controls.caption.container.value;
        var sLink = el.controls.link.container.value.replace(/https{0,1}:\/\//i, '');
        var params = new Array([control.section.id, 'link', iID, sCaption, sLink]);
        PageMethods.ProcessPressPageItems(params, function (pm, context) { PressPageCManager.SaveLinkOk(pm, context); }, null, [control, sCaption, sLink]);
    }
    this.SaveLinkOk = function (pm, context) {
        var el = context[0];
        if (!pm.IsLogged) {
            showLogin();
            return;
        }
        var section = el.section;
        this.AddLink(pm.Result, context[1], context[2], el.container);


        CManager.RemoveControl(el);
        el = null;

        section.controls.edit.container.style.display = 'none';
        section.controls.add.container.style.display = '';
    }

    this.CancelEditLink = function (section) {
        var el = section.controls.edit;

        if (el.referrer)
            el.referrer.container.style.display = '';

        el.container.style.display = 'none';
        section.controls.add.container.style.display = '';
    }

    this.DeleteLink = function (control) {
        if (confirm('Are you sure you want to delete this link?')) {
            var params = new Array([control.section.id, 'link', -control.id]);
            PageMethods.ProcessPressPageItems(params, function (pm, context) { PressPageCManager.DeleteLinkOk(pm, context); }, null, control);
        }
    }
    this.DeleteLinkOk = function (pm, context) {
        if (!pm.IsLogged) {
            showLogin();
            return;
        }
        CManager.RemoveControl(context);
    }
}

/* End NewsControl */

var PressPageCManager = new PressPageControlsManager();

function SliderControlManager(csectioncontrol)
{
    this.UpdateSliderOptions = function(sender)
    {
    
    }
}
var SliderManager = new SliderControlManager(null);

//var News = new NewsControl(CManager.tabs['4'].sections[16]);



