﻿if (document.implementation.hasFeature("XPath", "3.0")) {
    // prototying the XMLDocument 
    XMLDocument.prototype.selectNodes = function(cXPathString, xNode) {
        if (!xNode) { xNode = this; }
        var oNSResolver = this.createNSResolver(this.documentElement)
        var aItems = this.evaluate(cXPathString, xNode, oNSResolver,
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
        var aResult = [];
        for (var i = 0; i < aItems.snapshotLength; i++) {
            aResult[i] = aItems.snapshotItem(i);
        }
        return aResult;
    }

    // prototying the Element 
    Element.prototype.selectNodes = function(cXPathString) {
        if (this.ownerDocument.selectNodes) {
            return this.ownerDocument.selectNodes(cXPathString, this);
        }
        else { throw "For XML Elements Only"; }
    }
}

// check for XPath implementation 
if (document.implementation.hasFeature("XPath", "3.0")) {
    // prototying the XMLDocument 
    XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode) {
        if (!xNode) { xNode = this; }
        var xItems = this.selectNodes(cXPathString, xNode);
        if (xItems.length > 0) {
            return xItems[0];
        }
        else {
            return null;
        }
    }

    // prototying the Element 
    Element.prototype.selectSingleNode = function(cXPathString) {
        if (this.ownerDocument.selectSingleNode) {
            return this.ownerDocument.selectSingleNode(cXPathString, this);
        }
        else { throw "For XML Elements Only"; }
    }
}

function WPSCDef() {
    var InternalWebPartPage;
    var NotificationService = new NotificationServiceDef();
    function FirePartCommunicationEvents(connectedParts, isInit) {
        var interfaceObject;
        for (var i = 0; i < connectedParts.length; i++) {
            interfaceObject = eval(connectedParts[i]);
            if (interfaceObject != null) {
                if (isInit) {
                    try {
                        interfaceObject.PartCommunicationInit(WPSC);
                    }
                    catch (e) {
                    }
                }
                else {
                    try {
                        interfaceObject.PartCommunicationMain();
                    }
                    catch (e) {
                    }
                }
            }
        }
    }
    function InitPartCommunication() {
        var xmlNodes;
        if (MSOConnections == null)
            return;
        xmlNodes = MSOConnections.selectNodes("Connections/Connection");
        if (xmlNodes == null)
            return;
        var connectedParts = new Array();
        var isProviderInList = false;
        var isConsumerInList = false;
        var xmlProviderRef = null;
        var xmlConsumerRef = null;
        for (var i = 0; i < xmlNodes.length; i++) {
            xmlProviderRef = xmlNodes.item(i).selectSingleNode("@ProviderObject");
            xmlConsumerRef = xmlNodes.item(i).selectSingleNode("@ConsumerObject");
            isProviderInList = false;
            isConsumerInList = false;
            if (xmlProviderRef != null && xmlConsumerRef != null) {
                for (var j = 0; j < connectedParts.length; j++) {
                    if (connectedParts[j] == xmlProviderRef.text) {
                        isProviderInList = true;
                    }
                    if (connectedParts[j] == xmlConsumerRef.text) {
                        isConsumerInList = true;
                    }
                }
                if (!isProviderInList) {
                    connectedParts[connectedParts.length] = xmlProviderRef.text;
                }
                if (!isConsumerInList) {
                    connectedParts[connectedParts.length] = xmlConsumerRef.text;
                }
            }
        }
        FirePartCommunicationEvents(connectedParts, true);
        FirePartCommunicationEvents(connectedParts, false);
    }
    function RaiseConnectionEventSpecial(InterfaceName, EventName, EventArgsNames, EventArgsValues) {
        var eventArgs = new Object();
        var tempNames = ConvertVBArrayIfNecessary(EventArgsNames);
        var tempValues = ConvertVBArrayIfNecessary(EventArgsValues);
        if (tempNames.length == tempValues.length) {
            for (var i = 0; i < tempNames.length; i++) {
                eval("eventArgs." + tempNames[i] + "=ConvertVBArrayIfNecessary(tempValues[i])");
            }
            RaiseConnectionEvent(InterfaceName, EventName, eventArgs);
        }
    }
    function ConvertVBArrayIfNecessary(vbarray) {
        try {
            var a = new VBArray(vbarray);
            return a.toArray();
        }
        catch (e) {
            return vbarray;
        }
    }
    function RaiseConnectionEvent(InterfaceName, EventName, EventParams) {
        var fProvider = false;
        var xmlNodes;
        var xmlSourceRef;
        var xmlTargetRef;
        var strEval;

        if (MSOConnections.selectSingleNode("Connections/Connection[@ProviderIntName='" + InterfaceName + "']") != null) {
            fProvider = true;
        }

        if (fProvider) {
            xmlNodes = MSOConnections.selectNodes("Connections/Connection[@ProviderIntName='" + InterfaceName + "']");
        }
        else {
            xmlNodes = MSOConnections.selectNodes("Connections/Connection[@ConsumerIntName='" + InterfaceName + "']");
        }
        if (xmlNodes != null) {
            for (var i = 0; i < xmlNodes.length; i++) {
                if (fProvider) {
                    xmlSourceRef = xmlNodes[i].selectSingleNode("@ProviderObject");
                    xmlTargetRef = xmlNodes[i].selectSingleNode("@ConsumerObject");
                }
                else {
                    xmlSourceRef = xmlNodes[i].selectSingleNode("@ConsumerObject");
                    xmlTargetRef = xmlNodes[i].selectSingleNode("@ProviderObject");
                }
                if (xmlSourceRef != null && xmlTargetRef != null) {
                    strEval = xmlTargetRef.value;
                    strEval += "." + EventName;
                    strEval += "(" + xmlSourceRef.value + ", EventParams)";
                    eval(strEval);
                }
            }
        }
    }
    function RegisterForPromptedSave(IsDirtyCallbackFunction, SaveCallbackFunction, Param) {
        StateService.RegisterForPromptedSave(IsDirtyCallbackFunction, SaveCallbackFunction, Param);
    }
    function Init(DOMObj) {
        window.attachEvent("onbeforeunload", StateService.BeforeUnloading);
        if (null != document.body) {
            document.body.attachEvent("onclick", new Function("if(StateService.IsScriptHREF()) {MSOWebPartPage_hideNextBeforeUnload=true;}"));
        }
        this.WebPartPage = new WebPartPageDef(DOMObj);
        return this.WebPartPage;
    }
    function Convert(InputString, InputType, OutputType) {
        var Converted = InputString;
        if ("URL" == InputType) {
            if ("UNICODE" == OutputType)
                Converted = URL2Unicode(InputString);
        }
        else if ("UNICODE" == InputType) {
            if ("URL" == OutputType)
                Converted = Unicode2URL(InputString);
        }
        return Converted;
    }
    function MSOMenu_GetMenuItem(MenuClientID, MenuOptionID) {
        var menuItem = null;
        var menu = document.all.item(MenuClientID);
        if (menu != null) {
            menuItem = menu.all.item(MenuOptionID);
        }
        return menuItem;
    }
    function MSOMenu_SetChecked(MenuClientID, MenuOptionID, SetValue) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            menuItem.checked = (SetValue) ? 'true' : 'false';
        }
    }
    function MSOMenu_SetVisible(MenuClientID, MenuOptionID, SetValue) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            menuItem.style.display = (SetValue) ? '' : 'none';
        }
    }
    function MSOMenu_SetEnabled(MenuClientID, MenuOptionID, SetValue) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            menuItem.disabled = !(SetValue == true);
        }
    }
    function MSOMenu_GetChecked(MenuClientID, MenuOptionID) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            return (menuItem.checked == 'true') ? true : false;
        }
        return null;
    }
    function MSOMenu_GetVisible(MenuClientID, MenuOptionID) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            return (menuItem.style.display != 'none') ? true : false;
        }
        return null;
    }
    function MSOMenu_GetEnabled(MenuClientID, MenuOptionID) {
        var menuItem = MSOMenu_GetMenuItem(MenuClientID, MenuOptionID);
        if (menuItem != null) {
            return (menuItem.disabled != true) ? true : false;
        }
        return null;
    }
    this.RaiseConnectionEvent = RaiseConnectionEvent;
    this.RaiseConnectionEventSpecial = RaiseConnectionEventSpecial;
    this.InitPartCommunication = InitPartCommunication;
    this.RaiseEvent = NotificationService.RaiseEvent;
    this.RegisterForEvent = NotificationService.RegisterForEvent;
    this.UnRegisterForEvent = NotificationService.UnRegisterForEvent;
    this.RegisterForPromptedSave = RegisterForPromptedSave;
    this.Init = Init;
    this.WebPartPage = InternalWebPartPage;
    this.Convert = Convert;
    this.MSOMenu_SetChecked = MSOMenu_SetChecked;
    this.MSOMenu_SetVisible = MSOMenu_SetVisible;
    this.MSOMenu_SetEnabled = MSOMenu_SetEnabled;
    this.MSOMenu_GetChecked = MSOMenu_GetChecked;
    this.MSOMenu_GetVisible = MSOMenu_GetVisible;
    this.MSOMenu_GetEnabled = MSOMenu_GetEnabled;
}

function NotificationServiceDef() {
    //var Events=new Collection();
    function RegisterSupportedBrowserEvent(eventName, eventFunction) {
        switch (eventName) {
            case "onafterprint":
            case "onbeforeprint":
            case "onbeforeunload":
            case "onblur":
            case "onclose":
            case "onload":
            case "onresize":
            case "onfocus":
                window.attachEvent(eventName, eventFunction);
                break;
            case "onclick":
            case "onhelp":
                window.document.attachEvent(eventName, eventFunction);
                break;
            default:
                break;
        }
    }
    function UnRegisterSupportedBrowserEvent(eventName, eventFunction) {
        switch (eventName) {
            case "onafterprint":
            case "onbeforeprint":
            case "onbeforeunload":
            case "onblur":
            case "onclose":
            case "onload":
            case "onresize":
            case "onfocus":
                window.detachEvent(eventName, eventFunction);
                break;
            case "onclick":
            case "onhelp":
                window.document.detachEvent(eventName, eventFunction);
                break;
            default:
                break;
        }
    }
    function RaiseEvent(Namespace, Event, Data) {
        var Event;
        var EventName;
        EventName = Namespace + "::" + Event;
        //Event=Events.FindByName(EventName);
        //if (null !=Event)
        //	Event.Raise(Data);
    }
    function RegisterForEvent(Namespace, Event, CallbackFunction, Qualifier) {
        var EventObject;
        var EventName;
        EventName = Namespace + "::" + Event;
        EventObject = null; //Events.FindByName(EventName, Qualifier);
        if (EventObject == null) {
            EventObject = new EventDef(EventName);
            EventObject.Qualifier = Qualifier;
            //Events.Add(EventObject);
        }
        if (EventObject.FindEventHandler(CallbackFunction) == null) {
            if (Namespace == "urn:schemas-microsoft-com:dhtml") {
                RegisterSupportedBrowserEvent(Event, CallbackFunction);
            }
            EventObject.AddHandler(CallbackFunction);
        }
    }
    function UnRegisterForEvent(Namespace, Event, CallbackFunction, Qualifier) {
        var EventObject;
        var EventName;
        EventName = Namespace + "::" + Event;
        EventObject = null; //Events.FindByName(EventName, Qualifier);
        if ((EventObject != null) && (EventObject.FindEventHandler(CallbackFunction) != null)) {
            if (Namespace == "urn:schemas-microsoft-com:dhtml") {
                UnRegisterSupportedBrowserEvent(Event, CallbackFunction);
            }
            EventObject.RemoveHandler(CallbackFunction);
        }
    }
    this.RegisterForEvent = RegisterForEvent;
    this.RaiseEvent = RaiseEvent;
    this.UnRegisterForEvent = UnRegisterForEvent;
}


var WPSC = new WPSCDef();
