// Global variables
var AllowResizing = false;
var MouseState = 'Released';
var ResizeState = 'Released';
var OriginalX = 0;
var OriginalPageWidth = 0;
var OriginalNavWidth = 200;
var OriginalDividerLeft = 0;
var OriginalContentLeft = 0;
var OriginalContentWidth = 0;
var newX = 0;
var dX = 0;
var NavWidth = 200;
var DividerLeft = 0;
var ContentLeft = 0;
var ContentWidth = 0;

function InitializeInterface_Interface2() {
    //Initialize the scroll positions
    InitializeScrollPosition();
    //Remove DivResizing for downlevel browsers
    if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
        //IE 6 and below //alert('This message is displayed only on Internet Explorer 6 and below! [Browser:' + Sys.Browser.name + ' Version:' + Sys.Browser.version + ']');
        //Turn off div resizing
        $get('interface_divider').style.display = 'none';
    } else {
        //Turn on div resizing
        AllowResizing = true;
    }
    //Bizarre Panel Visibility on News Page
    //ForceContentRedraw(); - NO!! only happens from News Page - other pages have problems if this is run e,g, scrolltoelement...
    //DOM: 06/03/09
    // NO!! fixed the relevant pages to stop this bug
    // IE7 still has "div flash" problem with promotions control - left it as is rather than put in ugly hacks
    
    //Attach Resize event properly (XHTML Compliant)
    window.onresize = ResizeDiv;

    if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
        window.onmouseup = ResizeDiv_MouseUp;
        window.onmousemove = SetDivPosition;
    } else {
        //document.onresize = ResizeDiv;
        document.onmouseup = ResizeDiv_MouseUp;
        document.onmousemove = SetDivPosition;
    }
    //Scroll Navigation Pane to force current selected node into view
    NavigationScroll();
}

//// Force Content Visible
//function ForceContentRedraw() {
//    RedrawElement("outer");
//    RedrawElement("top");
//    RedrawElement("left");
//    RedrawElement("left_IE6");
//}
//function RedrawElement(ContainerID) {
//    var Container = $get(ContainerID);
//    if (Container != null) {
//        Container.style.display = 'none';
//        Container.style.display = 'block';
//    }
//}

// Initialize scroll positions for page / div
function InitializeScrollPosition() {
    var divY = GetScrollPosition_Div();
    var div_content = $get('outer');
    div_content.scrollTop = divY;
    // Attach SetScrollPosition_Div() function to div's onscroll event.
    div_content.onscroll = SetScrollPosition_Div;
}

//Reset Scroll Position
function ResetScrollPosition() {
    var divY = GetScrollPosition_Div();
    var div_content = $get('outer');
    //If scroll position has moved from that recorded (and recorded position is greater than zero) - then reset scroll position
    if (div_content.scrollTop != divY && divY > 0) {
        div_content.scrollTop = divY;
    }
}

// This function sets the scroll position of div to hidden field
function SetScrollPosition_Div() {
    var divY = $get('outer').scrollTop;
    StoreScrollPosition(divY);
}

function GetScrollPosition_Div() {
    return $get(HiddenFieldScrollPositionClientID).value;
}

function StoreScrollPosition(yPos) {
    $get(HiddenFieldScrollPositionClientID).value = yPos;
}

//Assign current interface / mouse positions (on divider mouse down)
function getDivPosition(mouse) {
    // Assign the global variable to 'Pressed'
    MouseState = 'Pressed';
    //Change cursot to horizontal resize
    document.body.style.cursor = 'col-resize';
    // Save the original position variables 
    OriginalX = mouse.clientX;
    OriginalNavWidth = $get('left').offsetWidth;
    OriginalDividerLeft = $get('interface_divider').offsetLeft;
    OriginalContentLeft = $get('outer').offsetLeft;
    OriginalContentWidth = $get('outer').offsetWidth;
}

//Resize Divider (on body mouse move)
function SetDivPosition(mouse) {
    //alert('SetDivPostion');
    if (MouseState == 'Pressed') {
        if (mouse != null) {
            dX = mouse.clientX - OriginalX;
        } else {dX = event.clientX - OriginalX; }
        NavWidth = OriginalNavWidth + dX;
        ResizeInterface(NavWidth);
    }
}

//Resize Interface (on browser resize)
function ResizeDiv() {
    //Close Search Popup if visible
    CloseSearch();
    //Resize Interface
    ResizeInterface(NavWidth);
}

function ResizeDiv_MouseUp() {
    if (MouseState == 'Pressed') {
        // Assign the global variable to 'Pressed'
        MouseState = 'Released';
        document.body.style.cursor = 'auto';
    }
}

//Resize Interface
function ResizeInterface(x) {
    if (AllowResizing == true) {
        //Calculate new dimensions for interface
        NavWidth = x;
        DividerLeft = x - 4;
        ContentWidth = pageWidth() - x;
        if ((ContentWidth > 0) && (NavWidth > 0)) {
            //Resize Elements
            $get('left').style.width = NavWidth + 'px';
            document.getElementById('interface_divider').style.left = DividerLeft + 'px';
            if (document.getElementById('outer').clientLeft == undefined) {
                //Firefox
                document.getElementById('outer').style.left = NavWidth + 'px';
                document.getElementById('outer').style.width = ContentWidth + 'px';
            }
            else {
                //IE
                var clientLeft = document.getElementById('outer').clientLeft;
                document.getElementById('outer').style.left = (NavWidth - clientLeft) + 'px';
                document.getElementById('outer').style.width = (ContentWidth + clientLeft) + 'px';
            }
        }
    }
    //Bizarre Panel Visibility on News Page
    //ForceContentRedraw();
}

function NavigationScroll() {
    //ClientID of selected node is stored in this hidden field automatically
    var ne = $get(TreeViewNavigationClientID + '_SelectedNode');
    if (ne != null) {
        if (ne.value != '') {
            var ne_element = $get(ne.value);
            if (ne_element != null) {
                var div_left = $get('left');

                ne_element_yPos = ne_element.offsetTop;
                tempEl = ne_element.offsetParent;
                while (tempEl != null) {
                    ne_element_yPos += tempEl.offsetTop;
                    tempEl = tempEl.offsetParent;
                }

                //alert('div_left.offsetHeight + offsetTop: ' + (div_left.offsetHeight + div_left.offsetTop));
                //alert('ne_element_yPos: ' + ne_element_yPos);
                if (ne_element_yPos > (div_left.offsetHeight + div_left.offsetTop)) {
                ne_element.scrollIntoView();
                div_left.scrollLeft = 0;}
            } 
        }
    }
}

function pageWidth() { return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null; }
function pageHeight() { return window.innerHeight != null ? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null ? document.body.clientHeight : null; }
function posLeft() { return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0; }
function posTop() { return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0; }
function posRight() { return posLeft() + pageWidth(); }
function posBottom() { return posTop() + pageHeight(); }

if (typeof (EventListener) != 'undefined') {
    var addEHandler = function(obj, event_name, handler) {
        obj.addEventListener(event_name, handler, false);
    };
    var removeEHandler = function(obj, event_name, handler) {
        obj.removeEventListener(event_name, handler, false);
    };
}
else if (typeof (attachEvent) != 'undefined') {
    var addEHandler = function(obj, event_name, handler) {
        obj.attachEvent('on' + event_name, handler);
    };
    var removeEHandler = function(obj, event_name, handler) {
        obj.detachEvent('on' + event_name, handler);
    };
}


function EventContextWrapper() { };
EventContextWrapper.prototype =
    {
        handleEvent: function(evt) // implements DOM::EventListener::handleEvent
        {
            this.callback(evt);
        },
        invoke_event: function(evt) {
            this.handleEvent(evt);
        }
    };

EventContextWrapper.create = function(p_contextobj, p_interface, props) {
    if (typeof (EventListener) != 'undefined')
        var wrapper = new EventContextWrapper();
    else if (typeof (window.attachEvent) != 'undefined') {
        var wrapper = function(evt) { arguments.callee.callback(evt); };
        wrapper.invoke_event = function(evt) { this(evt); };
    }
    wrapper.$context = p_contextobj;
    wrapper.$props = props != undefined && props instanceof Object ? props : null;
    wrapper.callback = p_interface.$callback;
    return wrapper;
};