﻿var Bridge = {};

Bridge.DomUtil = function() { 
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;
    var $ = $D.get;
    
    return {
        
    };
}();

Bridge.AjaxManager = function() { 
    var pageRequestManager;
    
    return { 
        init: function() { 
            try { 
                pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
            } catch(ex) {  } 
        }, 
        addOnEndRequest: function(endRequestCallback) {
            if(pageRequestManager) { pageRequestManager.add_endRequest(endRequestCallback); }
        }
    };
}();

Bridge.PageManager = function() { 
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;
    var $ = $D.get;
    var $cn = $D.getElementsByClassName;
    
    var selectedDate;
    
    var getWindowProperties = function(windowConfig) { 
        var windowProperties = "";
        if(windowConfig) { 
            if(windowConfig.toolbar) { 
                if(windowProperties !== "") { windowProperties += "," }  
                windowProperties += "toolbar=" + windowConfig.toolbar;
            }
            if(windowConfig.height) {
                if(windowProperties !== "") { windowProperties += "," }  
                windowProperties += "height=" + windowConfig.height;
            }
            if(windowConfig.width) { 
                if(windowProperties !== "") { windowProperties += "," }  
                windowProperties += "width=" + windowConfig.width;
            }
        }
        windowProperties += ",resizable=yes,scrollbars=yes";
        return windowProperties;
    }
    
    var onListItemMouseOver = function(e, listItemEl) { 
        $D.setStyle(listItemEl, "background", "#FFFFC1");
        $D.setStyle(listItemEl, "cursor", "pointer");
    }
    var onListItemMouseOut = function(e, listItemEl) { 
        $D.setStyle(listItemEl, "background", "#FFF");
        $D.setStyle(listItemEl, "cursor", "default");
    }
    var onListItemClick = function(e, listItemEl) { 
        var anchors = listItemEl.getElementsByTagName("a");
        if(anchors && anchors.length > 0) { 
            var anchor = anchors[0];
            if(!anchor.click) { 
                var evt = document.createEvent("MouseEvents");
                evt.initMouseEvent("click", true, true);
                anchor.dispatchEvent(evt);
            } else { 
                anchor.click(); 
            }
        }
    }
    
    return { 
        init: function() {
            //Set up rollover listitems
            var listItems = $cn("list-item");
            var i, listItemLength = listItems.length;
            for(i = 0; i < listItemLength; i++) { 
                var listItemEl = listItems[i];
                $E.on(listItemEl, "mouseover", onListItemMouseOver, listItemEl);
                $E.on(listItemEl, "mouseout", onListItemMouseOut, listItemEl);
                $E.on(listItemEl, "click", onListItemClick, listItemEl);
            }
            
            //Set focus
            var shouldSetFocus = function(el) { var focusAttr = el.getAttribute("shouldFocus"); if(focusAttr && (focusAttr === "true")) { el.focus(); } };
            var focusableInputs = $D.getElementsBy(shouldSetFocus);
            if(focusableInputs.length > 0) { 
                focusableInputs[0].focus(); //Set focus on first focusable input in DOM
            }
        }, 
        selectDate: function(dateTime) { 
            selectedDate = dateTime; 
        }, 
        showPopup: function(url, windowConfig) { 
            var windowProperties = getWindowProperties(windowConfig);
            
            
            if(Bridge.ControlManager.tabViews.length > 0) { 
                
                var tabView = Bridge.ControlManager.tabViews[0];
                var activeTabIndex = tabView.getTabIndex(tabView.get("activeTab"));
                switch(activeTabIndex) { 
                    case 0:
                    url += "?Mode=Month";
                    break;
                    case 1:
                    url += "?Mode=Week";
                    break;
                    case 2:
                    url += "?Mode=Day";
                    break;
                }
                
                var selectedDateContainerEl = $("selected-date");
                var selectedDateEl = selectedDateContainerEl.getElementsByTagName("input")[0];
                url+= "&SelectedDate=" + selectedDateEl.value;
            }
            
            var newWindow = window.open(url, "newWindow", windowProperties);
            if(newWindow.focus) { newWindow.focus(); } 
        }
    };
}();

Bridge.ControlManager = function() { 
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;
    var $ = $D.get;
    var $cn = $D.getElementsByClassName;
    
    var photoBoxEl, photoBox;
    var panelElCol = [], panelHash = [], toolTipElCol = [], toolTipHash = [];
    var tabViewElCol = [], tabViewHash = [], tabViewCol = [];
    var editorElCol = [], editorHash = [], editorCol = [];
    var calendarGroupElCol = [], calendarGroupHash = [], calendarGroupCol = [], calendarElCol = [] , calendarHash = [], calendarCol = [];
    var calendarGroupButtonElCol = [], calendarGroupButtonHash = [], calendarImageElCol = [], calendarImageHash = [];
    var calendarGroupPostButtonElCol = [], calendarGroupPostButtonHash = [];
    var calendarGroupInputElCol = [], calendarGroupInputHash = [], calendarInputElCol = [], calendarInputHash = [];
    var buttonElCol = [], buttonHash = [];
    var menuAnimation, menuBarElCol = [], menuBarHash = [];
    
    var onEditorSubmit = function() { 
        var i, editorColLength = editorCol.length;
        for(i = 0; i < editorColLength; i++) { 
            var editor = editorCol[i];
            editor.saveHTML();
        }
    }   
    
    function onMenuBeforeShow(p_sType, p_sArgs) {

        var oBody,
            oShadow,
            oUL;
    
        if (this.parent) {
            oShadow = this.element.lastChild;
            oShadow.style.height = "0px";
        
            if (menuAnimation && menuAnimation.isAnimated()) {
                menuAnimation.stop();
                menuAnimation = null;
            
            }

            oBody = this.body;
            oUL = oBody.getElementsByTagName("ul")[0];

            $D.setStyle(oBody, "overflow", "hidden");
            $D.setStyle(oUL, "marginTop", ("-" + oUL.offsetHeight + "px"));
        }
    }

    function onTween(p_sType, p_aArgs, p_oShadow) {
        if (this.cfg.getProperty("iframe")) {
            this.syncIframe();
        }
    
        if (p_oShadow) {
            p_oShadow.style.height = this.element.offsetHeight + "px";
        }
    }

    function onAnimationComplete(p_sType, p_aArgs, p_oShadow) {
        var oBody = this.body,
            oUL = oBody.getElementsByTagName("ul")[0];

        if (p_oShadow) {
            p_oShadow.style.height = this.element.offsetHeight + "px";
        }

        $D.setStyle(oUL, "marginTop", "auto");
        $D.setStyle(oBody, "overflow", "visible");
        
        if (YAHOO.env.ua.ie) {
            $D.setStyle(oBody, "zoom", "1");
        }
    }


    // "show" event handler for each submenu of the menu bar
    function onMenuShow(p_sType, p_sArgs) {

        var oElement,
            oShadow,
            oUL;
    
        if (this.parent) {
            oElement = this.element;
            oShadow = oElement.lastChild;
            oUL = this.body.getElementsByTagName("ul")[0];
        
            menuAnimation = new YAHOO.util.Anim(oUL, 
                { marginTop: { to: 0 } },
                .5, YAHOO.util.Easing.easeOut);


            menuAnimation.onStart.subscribe(function () {
                oShadow.style.height = "100%";
            });


            menuAnimation.animate();

            if (YAHOO.env.ua.ie) {
                oShadow.style.height = oElement.offsetHeight + "px";
                menuAnimation.onTween.subscribe(onTween, oShadow, this);
            }
            menuAnimation.onComplete.subscribe(onAnimationComplete, oShadow, this);
        }
    }
    
    //Objects
    var CalendarGroup = function(el, buttonEl, inputEl, postButtonEl, config) { 
        var calGroup;
        var isShowing = false;
        
        var onClick = function(e) { 
            if(!isShowing) { 
	            if(inputEl.value !== "") {  
	                calGroup.clear();
	                calGroup.select(inputEl.value); 
	                
	                var dayParts = inputEl.value.split("/");
	                if(dayParts) {
	                    calGroup.setMonth(dayParts[0] - 1);
	                    calGroup.setYear(dayParts[2]);
	                }
	            }
	            
	            calGroup.render();
                calGroup.show();
                
                var clickXY = $E.getXY(e);
                $D.setXY(el, clickXY);
                
                isShowing = true;
            }
        }
    
        var onSelect = function(type,args,obj) {
			if(isShowing) { 
			    var dates = args[0]; 
			    var date = dates[0];
			    var year = date[0], month = date[1], day = date[2];
			    inputEl.value = month + "/" + day + "/" + year;
    			
			    calGroup.hide();
    			
			    if(config.submit === "true") { postButtonEl.click(); }
			    
			    isShowing = false;
			}
		};
        
        return { 
            init: function() { 
                calGroup = new YAHOO.widget.CalendarGroup("calendar-group-"+el.id, el.id, { pages:2, title:"Please make a selection:", close:true } );
                calGroup.selectEvent.subscribe(onSelect);
                
		        $E.on(buttonEl, "click", onClick);
            }
        };    
    }
    var Calendar = function(el, imageEl, inputEl, config) { 
        var cal;
        var isShowing = false;
        
        var onClick = function(e) { 
            if(!isShowing) { 
	            if(inputEl.value !== "") {  
	                cal.clear();
	                cal.select(inputEl.value); 
	                
	                var dayParts = inputEl.value.split("/");
	                if(dayParts) {
	                    cal.setMonth(dayParts[0] - 1);
	                    cal.setYear(dayParts[2]);
	                }
	            }
	            
	            cal.render();
                cal.show();
                
                var clickXY = $E.getXY(e);
                $D.setXY(el, clickXY);
                
                isShowing = true;
            }
        }
    
        var onSelect = function(type,args,obj) {
			if(isShowing) { 
			    var dates = args[0]; 
			    var date = dates[0];
			    var year = date[0], month = date[1], day = date[2];
			    inputEl.value = month + "/" + day + "/" + year;
    			
			    cal.hide();
			    
			    isShowing = false;
			}
		};
        
        return { 
            init: function() { 
                cal = new YAHOO.widget.Calendar("calendar-"+el.id, el.id, { title:"Choose a date:", close:true } );
		        cal.selectEvent.subscribe(onSelect);
		        
		        $E.on(imageEl, "click", onClick);
            }
        };    
    }
    
    return {
        init: function() { 
            var i = 0;
			
			menuBarElCol = $cn("yuimenubar");
		    var menuBarElColLength = menuBarElCol.length;
            for(i = 0; i < menuBarElColLength; i++) { 
                var menuBarEl = menuBarElCol[i];
                
                var menuBar = new YAHOO.widget.MenuBar(menuBarEl, { autosubmenudisplay: true, hidedelay: 750, lazyload: true, position: "static" });
                menuBar.subscribe("beforeShow", onMenuBeforeShow);
                menuBar.subscribe("show", onMenuShow);
                menuBar.render();
                
                menuBarHash[menuBarEl.id] = menuBar;
		    }
         
	        //TabView
	        tabViewElCol = $cn("yui-navset");
	        var tabViewElColLength = tabViewElCol.length;
	        for(i = 0; i < tabViewElColLength; i++) { 
	            var tabViewEl = tabViewElCol[i];
	            var tabView = tabViewHash[tabViewEl.id];
	            var activeTabIndex = 0;
	            if(typeof(tabView) === "undefined") { 
	                tabView = new YAHOO.widget.TabView(tabViewEl);
	            } else { 
	                activeTabIndex = tabView.getTabIndex(tabView.get("activeTab"));
	                tabView = new YAHOO.widget.TabView(tabViewEl, { activeIndex: activeTabIndex } );
	                tabViewCol.pop();
	            }
	            tabViewHash[tabViewEl.id] = tabView;
                tabViewCol.push(tabView);
	        }   

            //Panels
            panelElCol = $cn("panel");
            var panelElColLength = panelElCol.length;
            for(i = 0; i < panelElColLength; i++) { 
                var panelEl = panelElCol[i];
                var panel = new YAHOO.widget.Panel(panelEl, { width:"320px", visible:false, constraintoviewport:true, draggable:false } );
		        panel.render();
		        panelHash[panelEl.id] = panel;
		    }
		    
//		    var hasTitle = function(el) { return (el.getAttribute("title") != ""); }
//		    toolTipElCol = $D.getElementsBy(hasTitle, "a");
//		    var toolTipElColLength = toolTipElCol.length;
//		    for(i = 0; i < toolTipElColLength; i++) { 
//		        var toolTipEl = toolTipElCol[i];
//		        var toolTip =  new YAHOO.widget.Tooltip("tt" + i, { context:toolTipEl.id });
//		        toolTipHash[toolTipEl.id] = toolTip;
//		    }
		    
            //Photobox
            photoBoxEl = $("photobox");
            if(photoBoxEl) { 
                photoBox = new YAHOO.widget.PhotoBox(photoBoxEl, 
	            { 
		            effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.15}, 
		            fixedcenter:true,
		            constraintoviewport:true,
		            underlay:"none",
		            close:true,
		            visible:false,
		            draggable:false,
		            modal:true, 
		            width:"500px"
	            } );
	            photoBox.render();
	        }

            //Buttons
            buttonElCol = $cn("button");
            var buttonElColLength = buttonElCol.length;
            for(i = 0; i < buttonElColLength; i++) { 
                var buttonEl = buttonElCol[i];
                if(buttonEl.id) { 
                    var button = new YAHOO.widget.Button(buttonEl);
                    
                    var onClickAttr = buttonEl.getAttribute("onclick");
                    if(onClickAttr) { button.on("click", onClickAttr); }
                    
                    buttonHash[buttonEl.id] = button;
                }
            }
		    
		    //Calendar Groups & Calendars
		    calendarGroupButtonElCol = $cn("calendar-group-button");
		    calendarGroupInputElCol = $cn("calendar-group-input");
		    calendarGroupPostButtonElCol = $cn("calendar-group-post-button");
		    calendarGroupElCol = $cn("calendar-group");
		    var calendarGroupElColLength = calendarGroupElCol.length;
            for(i = 0; i < calendarGroupElColLength; i++) { 
                var calendarGroupEl = calendarGroupElCol[i];
		        var calendarGroupButtonEl = calendarGroupButtonElCol[i];
                var calendarGroupInputEl = calendarGroupInputElCol[i];
		        var calendarGroupPostButtonEl = calendarGroupPostButtonElCol[i];
                var calendarGroup = CalendarGroup(calendarGroupEl, calendarGroupButtonEl, calendarGroupInputEl, calendarGroupPostButtonEl, { submit: "true" });
                calendarGroup.init();
                calendarGroupHash[calendarGroupEl.id] = calendarGroup;
                calendarGroupCol.push(calendarGroup);
		    }
		    
		    calendarInputElCol = $cn("calendar-input");
		    calendarImageElCol = $cn("calendar-image");
		    calendarElCol = $cn("calendar");
		    var calendarElColLength = calendarElCol.length;
            for(i = 0; i < calendarElColLength; i++) { 
                var calendarEl = calendarElCol[i];
		        var calendarImageEl = calendarImageElCol[i];
		        var calendarInputEl = calendarInputElCol[i];
                var calendar = Calendar(calendarEl, calendarImageEl, calendarInputEl, { submit: "false" });
                calendar.init();
                calendarHash[calendarEl.id] = calendar;
                calendarCol.push(calendar);
		    }
		    
            //Rich Text Editor
            var editorElCol = $cn("block-text");
            var editorElColLength = editorElCol.length;
            for(i = 0; i < editorElColLength; i++) { 
                var editorEl = editorElCol[i];
                if(!(editorHash[editorEl.id])) { 
                    var editorConfig = {
                        height: "300px",
                        width: "525px",
                        animate: true, 
                        visible: true
                    };
                    var editor = new YAHOO.widget.Editor(editorEl, editorConfig);
                    editor.render();
                    
                    editorCol.push(editor);
                    editorHash[editorEl.id] = editor;
                }
            }
            $E.on("aspnetForm", "submit", onEditorSubmit);
			
        }, 
        showPhotoBoxImage: function(imgIndex) { 
            if(photoBox) { 
                $D.setStyle(photoBoxTabViewEl, "visibility", "visible");  
                photoBox.showImage(imgIndex);
            }
        }, 
        getPanel: function(panelElId) { 
            return panelHash[panelElId];
        }, 
        getTabView: function(tabViewElId) { 
            return tabViewHash[tabViewElId];
        }, 
        getEditor: function(editorElId) { 
            return editorHash[editorElId];
        }, 
        getCalendarGroup: function(calendarGroupElId) { 
            return calendarGroupHash[calendarGroupElId];
        }, 
        getCalendar: function(calendarElId) { 
            return calendarHash[calendarElId];
        }, 
        
        tabViews: tabViewCol, 
        calendarGroups: calendarGroupCol, 
        calendars: calendarCol
    };
}();

Bridge.Extend = {};

Bridge.Extend.CityCalendar = { };
Bridge.Extend.CityCalendar.Environment = function() {
    var $C = YAHOO.util.Connect;
    var $D = YAHOO.util.Dom;
    var $E = YAHOO.util.Event;
    var $ = $D.get;
    
    var ajaxManager = Bridge.AjaxManager;
    var pageManager = Bridge.PageManager;
    var controlManager = Bridge.ControlManager;
    
    var showSubscriptionPanel = function(e) { 
        var targetXY = $E.getXY(e);
        
        var panel = controlManager.getPanel("subscription-panel");
        panel.moveTo(targetXY[0] + 120, targetXY[1] - 10);
        panel.show();
    }
    
    var initEnvironment = function() {
        //markup specific
        $E.on("subscribe-link", "click", showSubscriptionPanel, this, true);
        
        initManagers();
    }
    
    var initManagers = function() {
        pageManager.init();
        controlManager.init();
        ajaxManager.init();
    }
    
    return { 
        init: function() {
            initEnvironment();
            ajaxManager.addOnEndRequest(initEnvironment);
        }
    };
}();

(function() { 
    var $E = YAHOO.util.Event;
    $E.onDOMReady(Bridge.Extend.CityCalendar.Environment.init);
})();