Merge branch 'master' of https://github.com/dotnet/eShopOnContainers
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json" />
|
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnet-feb2017-patch/api/v3/index.json" />
|
||||||
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
59
README.md
@ -2,26 +2,30 @@
|
|||||||
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
|
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
|
||||||
|
|
||||||
> ### DISCLAIMER
|
> ### DISCLAIMER
|
||||||
> IMPORTANT: The current state of this sample application is ALPHA, therefore, many areas could change significantly while refactoring and getting improvements. Feedback and pull requests from the community will be appreciated.
|
> **IMPORTANT:** The current state of this sample application is **ALPHA**, consider it version a 0.1 foundational version, therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. **Feedback with improvements and pull requests from the community will be highly appreciated and accepted.**
|
||||||
>
|
>
|
||||||
> This reference application proposes a simplified microservice oriented architecture implementation (as mentioned, currently in ALPHA state) to introduce technologies like .NET Core with Docker containers through a comprehensive but simplified application. However, this reference application it is not trying to solve all the problems in a large and mission-critical distributed system, it is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
> This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. However, this reference application it is not trying to solve all the problems in a large and mission-critical distributed system, it is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
||||||
> <p>For example, the next step (still not covered here) after understanding Docker containers and microservices is to select a microservice cluster/orchestrator like Docker Swarm, Kubernetes or DC/OS (in Azure Container Service) or Azure Service Fabric which in most of the cases will require additional partial changes to your application's configuration (although the present architecture should work on most orchestrators with small changes). In the future we might fork this project and make multiple versions targeting specific microservice cluster/orchestrators. <p>
|
> <p>For example, the next step (still not covered here) after understanding Docker containers and microservices is to select a microservice cluster/orchestrator like Docker Swarm, Kubernetes or DC/OS (in Azure Container Service) or Azure Service Fabric which in most of the cases will require additional partial changes to your application's configuration (although the present architecture should work on most orchestrators with small changes). In the future we might fork this project and make multiple versions targeting specific microservice cluster/orchestrators. <p>
|
||||||
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the ISSUES level if you'd like to see any specific scenario implemented.
|
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue.
|
||||||
|
|
||||||
|
**Architecture overview**: This reference application is cross-platform either at the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps.
|
||||||
|
The architecture proposes a simplified microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the current communication protocol.
|
||||||
<p>
|
<p>
|
||||||
This reference application is cross-platform either in the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps.
|
The plan is to add asynchronous communication for data updates propagation across multiple services based on integration events and an event bus plus other features defined at the <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>roadmap</a>.
|
||||||
<p>
|
<p>
|
||||||
<img src="img/eshop_logo.png">
|
<img src="img/eshop_logo.png">
|
||||||
<img src="img/eShopOnContainers_Architecture_Diagram.png">
|
<img src="img/eShopOnContainers_Architecture_Diagram.png">
|
||||||
<p>
|
<p>
|
||||||
|
<p>
|
||||||
|
Additional miroservice styles with other frameworks and No-SQL databases will be added, eventually. This is a great opportunity for pull requests from the community, like a new microservice using Nancy, or even other languages like Node, Go, Python or data containers with MongoDB with Azure DocDB compatibility, Postgress, RavenDB, Event Store, MySql, etc. You name it! :)
|
||||||
|
|
||||||
> ### Important Note on Database Servers/Containers
|
> ### Important Note on Database Servers/Containers
|
||||||
> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server for Linux container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency in the cloud or server. Each database could also be deployed as a single Docker container, but then you'd need more then 8GB or memory RAM in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments.
|
> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server for Linux container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency to any cloud or specific server. Each database could also be deployed as a single Docker container, but then you'd need more then 8GB or memory RAM assigned to Docker in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments.
|
||||||
> <p> A similar case is defined in regards Redis cache running as a container for the development environment.
|
> <p> A similar case is defined in regards Redis cache running as a container for the development environment.
|
||||||
> <p> However, in a real production environment it is recommended to have persistance (SQL Server and Redis) in HA services like Azure SQL Database, Redis as a service or any other clustering system. If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in HA cloud or on-premises.
|
> <p> However, in a real production environment it is recommended to have your databases (SQL Server and Redis, in this case) in HA (High Available) services like Azure SQL Database, Redis as a service or any other clustering system. If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in a HA cloud or on-premises.
|
||||||
|
|
||||||
## Related documentation and guidance
|
## Related documentation and guidance
|
||||||
While developing this reference application, we've been creating a reference Guide/eBook named <b>"Architecting and Developing Containerized and Microservice based .NET Applications"</b> which explains in detail how to develop this kind of architectural style (microservices, Docker containers, Domain-Driven Design for certain microservices) plus other simpler architectural styles, like monolithic that can also live as Docker containers.
|
While developing this reference application, we are creating a reference Guide/eBook named <b>"Architecting and Developing Containerized and Microservice based .NET Applications"</b> which explains in detail how to develop this kind of architectural style (microservices, Docker containers, Domain-Driven Design for certain microservices) plus other simpler architectural styles, like monolithic apps that can also live as Docker containers.
|
||||||
<p>
|
<p>
|
||||||
There's also an additional eBook focusing on Containers/Docker lifecycle (DevOps, CI/CD, etc.) with Microsoft Tools, already published.
|
There's also an additional eBook focusing on Containers/Docker lifecycle (DevOps, CI/CD, etc.) with Microsoft Tools, already published.
|
||||||
You can start reviewing these Guides/eBooks here:
|
You can start reviewing these Guides/eBooks here:
|
||||||
@ -31,41 +35,36 @@ You can download both eBooks from here:
|
|||||||
| Architecting & Developing | Containers Lifecycle & CI/CD |
|
| Architecting & Developing | Containers Lifecycle & CI/CD |
|
||||||
| ------------ | ------------|
|
| ------------ | ------------|
|
||||||
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> |
|
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> |
|
||||||
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'>Download (Confidential DRAFT until published)</a> | <a href='https://aka.ms/dockerlifecycleebook'>Download</a> |
|
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'>**Download** (Early DRAFT, still work in progress)</a> | <a href='https://aka.ms/dockerlifecycleebook'>**Download** - First Edition from late 2016</a> |
|
||||||
|
|
||||||
|
|
||||||
<p>However, we encourage to review the "Architecting/Developing" eBook because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many sample implementations.
|
|
||||||
|
|
||||||
|
Send feedback to [cesardl@microsoft.com](cesardl@microsoft.com)
|
||||||
|
<p>
|
||||||
|
However, we encourage to download and review the "Architecting & Developing eBook" because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many pattern implementations, so you'll understand much better the context, design and decisions taken in the current architecture and internal designs.
|
||||||
|
|
||||||
## Overview of the application code
|
## Overview of the application code
|
||||||
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
||||||
|
|
||||||
The example business domain or scenario is based on an eShop or eCommerce which is implemented as a multi-container application. Each container is a microservice deployment (like the basket-microservice, catalog-microservice, ordering-microservice and the identity-microservice) which are developed using ASP.NET Core running on .NET Core so they can run either on Linux Containers and Windows Containers.
|
The example business domain or scenario is based on an eShop or eCommerce which is implemented as a multi-container application. Each container is a microservice deployment (like the basket-microservice, catalog-microservice, ordering-microservice and the identity-microservice) which are developed using ASP.NET Core running on .NET Core so they can run either on Linux Containers and Windows Containers.
|
||||||
The screenshot below shows the VS Solution structure for those microservices/containers and client apps.
|
The screenshot below shows the VS Solution structure for those microservices/containers and client apps.
|
||||||
- Open <b>eShopOnContainers.sln</b> for a solution containing all the projects (All client apps and services).
|
|
||||||
- Open <b>eShopOnContainers-ServicesAndWebApps.sln</b> for a solution containing just the server-side projects related to the microservices and web applications.
|
|
||||||
- Open <b>eShopOnContainers-MobileApps.sln</b> for a solution containing just the client mobile app projects (Xamarin mobile apps only).
|
|
||||||
|
|
||||||
|
- (*Recommended when getting started*) Open <b>eShopOnContainers-ServicesAndWebApps.sln</b> for a solution containing just the server-side projects related to the microservices and web applications.
|
||||||
|
- Open <b>eShopOnContainers-MobileApps.sln</b> for a solution containing just the client mobile app projects (Xamarin mobile apps only). It works independently based on mocks, too.
|
||||||
|
- Open <b>eShopOnContainers.sln</b> for a solution containing all the projects (All client apps and services).
|
||||||
|
|
||||||
<img src="img/vs-solution-structure.png">
|
<img src="img/vs-solution-structure.png">
|
||||||
|
|
||||||
Finally, those microservices are consumed by multiple client web and mobile apps, as described below.
|
Finally, those microservices are consumed by multiple client web and mobile apps, as described below.
|
||||||
|
<br>
|
||||||
<b>*MVC Application (ASP.NET Core)*</b>: Its an MVC 6 application where you can find interesting scenarios on how to consume HTTP-based microservices from C# running in the server side, as it is a typical ASP.NET Core MVC application. Since it is a server-side application, access to other containers/microservices is done within the internal Docker Host network with its internal name resolution.
|
<b>*MVC Application (ASP.NET Core)*</b>: Its an MVC 6 application where you can find interesting scenarios on how to consume HTTP-based microservices from C# running in the server side, as it is a typical ASP.NET Core MVC application. Since it is a server-side application, access to other containers/microservices is done within the internal Docker Host network with its internal name resolution.
|
||||||
<img src="img/eshop-webmvc-app-screenshot.png">
|
<img src="img/eshop-webmvc-app-screenshot.png">
|
||||||
|
<br>
|
||||||
<b>*SPA (Single Page Application)*</b>: Providing similar "eShop business functionality" but developed with Angular 2, Typescript and slightly using ASP.NET Core MVC 6. This is another approach for client web applications to be used when you want to have a more modern client behavior which is not behaving with the typical browser round-trip on every action but behaving like a Single-Page-Application which is more similar to a desktop app usage experience. The consumption of the HTTP-based microservices is done from TypeScript/JavaScript in the client browser, so the client calls to the microservices come from out of the Docker Host internal network (Like from your network or even from the Internet).
|
<b>*SPA (Single Page Application)*</b>: Providing similar "eShop business functionality" but developed with Angular 2, Typescript and slightly using ASP.NET Core MVC 6. This is another approach for client web applications to be used when you want to have a more modern client behavior which is not behaving with the typical browser round-trip on every action but behaving like a Single-Page-Application which is more similar to a desktop app usage experience. The consumption of the HTTP-based microservices is done from TypeScript/JavaScript in the client browser, so the client calls to the microservices come from out of the Docker Host internal network (Like from your network or even from the Internet).
|
||||||
<img src="img/eshop-webspa-app-screenshot.png">
|
<img src="img/eshop-webspa-app-screenshot.png">
|
||||||
|
<br>
|
||||||
<b>*Xamarin Mobile App (For iOS, Android and Windows/UWP)*</b>: It is a client mobile app supporting the most common mobilee OS platforms (iOS, Android and Windows/UWP). In this case, the consumption of the microservices is done from C# but running on the client devices, so out of the Docker Host internal network (Like from your network or even the Internet).
|
<b>*Xamarin Mobile App (For iOS, Android and Windows/UWP)*</b>: It is a client mobile app supporting the most common mobilee OS platforms (iOS, Android and Windows/UWP). In this case, the consumption of the microservices is done from C# but running on the client devices, so out of the Docker Host internal network (Like from your network or even the Internet).
|
||||||
|
|
||||||
<img src="img/xamarin-mobile-App.png">
|
<img src="img/xamarin-mobile-App.png">
|
||||||
|
|
||||||
> ### Note on tested Docker Containers/Images
|
|
||||||
> The development and testing of this project was (as of January 2017) done <b>only on Docker Linux containers</b> running in development machines with "Docker for Windows" and the default Hyper-V Linux VM (MobiLinuxVM) installed by "Docker for Windows".
|
|
||||||
The <b>Windows Containers scenario has not been implemented/tested yet</b>, but the application should be able to run on Windows Containers based on different Docker base images, as well, as the .NET Core services have also been tested running on plain Windows (with no Docker).
|
|
||||||
The app was also partially tested on "Docker for Mac" using a development MacOS machine with .NET Core and VS Code installed. However, that is still a scenario using Linux containers running on the VM setup in the Mac by the "Docker for Windows" setup.
|
|
||||||
|
|
||||||
## Setting up your development environment for eShopOnContainers
|
## Setting up your development environment for eShopOnContainers
|
||||||
### Visual Studio 2017 and Windows based
|
### Visual Studio 2017 and Windows based
|
||||||
This is the more straightforward way to get started:
|
This is the more straightforward way to get started:
|
||||||
@ -76,11 +75,15 @@ For those who prefer the CLI on Windows, using dotnet CLI, docker CLI and VS Cod
|
|||||||
https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
||||||
|
|
||||||
### CLI and Mac based
|
### CLI and Mac based
|
||||||
For those who prefer the CLI on a Mac, using dotnet CLI, docker CLI and VS Code for Mac:
|
For those who prefer the CLI on a Mac, using dotnet CLI, docker CLI and VS Code for Mac
|
||||||
|
(Instructions still TBD, but similar to Windows CLI):
|
||||||
https://github.com/dotnet/eShopOnContainers/wiki/04.-Setting-eShopOnContainer-solution-up-in-a-Mac,-VS-Code-and-CLI-environment--(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
https://github.com/dotnet/eShopOnContainers/wiki/04.-Setting-eShopOnContainer-solution-up-in-a-Mac,-VS-Code-and-CLI-environment--(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
||||||
|
|
||||||
> ### Note on Windows Containers
|
> ### Note on tested Docker Containers/Images
|
||||||
> As mentioned, the development and testing of this project (January 2017 version) was done on Docker Linux containers running in development machines with "Docker for Windows" and the default Hyper-V Linux VM (MobiLinuxVM) installed by "Docker for Windows".
|
> Most of the development and testing of this project was (as of early March 2017) done <b> on Docker Linux containers</b> running in development machines with "Docker for Windows" and the default Hyper-V Linux VM (MobiLinuxVM) installed by "Docker for Windows".
|
||||||
In order to run the application on Windows Containers you'd need to change the base images used by each container:
|
The <b>Windows Containers scenario is currently being implemented/tested yet</b>. The application should be able to run on Windows Nano Containers based on different Docker base images, as well, as the .NET Core services have also been tested running on plain Windows (with no Docker).
|
||||||
> - Official .NET Core base-image for Windows Containers, at Docker Hub: https://hub.docker.com/r/microsoft/dotnet/ (Using the Windows Nanoserver tag)
|
The app was also partially tested on "Docker for Mac" using a development MacOS machine with .NET Core and VS Code installed, which is still a scenario using Linux containers running on the VM setup in the Mac by the "Docker for Windows" setup. But further testing and feedback on Mac environments and Windows Containers, from the community, will be appreciated.
|
||||||
> - Official base-image for SQL Server on Windows Containers, at Docker Hub: https://hub.docker.com/r/microsoft/mssql-server-windows
|
|
||||||
|
## Sending feedback and pull requests
|
||||||
|
As mentioned, ew'd love to get your feedback, improvements and ideas.
|
||||||
|
Create new issues at the issues section and/or send emails to cesardl@microsoft.com
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
# eShopOnContainers - Microservices Architecture and Containers based Reference Application (**ALPHA state** - VS 2017 and CLI environments compatible)
|
|
||||||
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
|
|
||||||
|
|
||||||
> ### DISCLAIMER
|
|
||||||
> IMPORTANT: The current state of this sample application is ALPHA, therefore, many areas could change significantly while refactoring and getting improvements. Feedback and pull requests from the community will be appreciated.
|
|
||||||
>
|
|
||||||
> This reference application proposes a simplified microservice oriented architecture implementation (as mentioned, currently in ALPHA state) to introduce technologies like .NET Core with Docker containers through a comprehensive but simplified application. However, this reference application it is not trying to solve all the problems in a large and mission-critical distributed system, it is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core.
|
|
||||||
> <p>For example, the next step (still not covered here) after understanding Docker containers and microservices is to select a microservice cluster/orchestrator like Docker Swarm, Kubernetes or DC/OS (in Azure Container Service) or Azure Service Fabric which in most of the cases will require additional partial changes to your application's configuration (although the present architecture should work on most orchestrators with small changes). In the future we might fork this project and make multiple versions targeting specific microservice cluster/orchestrators. <p>
|
|
||||||
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the ISSUES level if you'd like to see any specific scenario implemented.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This reference application is cross-platform either in the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps.
|
|
||||||
<p>
|
|
||||||
<img src="img/eshop_logo.png">
|
|
||||||
<img src="img/eShopOnContainers_Architecture_Diagram.png">
|
|
||||||
<p>
|
|
||||||
|
|
||||||
> ### Important Note on Database Servers/Containers
|
|
||||||
> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server for Linux container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency in the cloud or server. Each database could also be deployed as a single Docker container, but then you'd need more then 8GB or memory RAM in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments.
|
|
||||||
> <p> A similar case is defined in regards Redis cache running as a container for the development environment.
|
|
||||||
> <p> However, in a real production environment it is recommended to have persistance (SQL Server and Redis) in HA services like Azure SQL Database, Redis as a service or any other clustering system. If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in HA cloud or on-premises.
|
|
||||||
|
|
||||||
## Related documentation and guidance
|
|
||||||
While developing this reference application, we've been creating a reference Guide/eBook named <b>"Architecting and Developing Containerized and Microservice based .NET Applications"</b> which explains in detail how to develop this kind of architectural style (microservices, Docker containers, Domain-Driven Design for certain microservices) plus other simpler architectural styles, like monolithic that can also live as Docker containers.
|
|
||||||
<p>
|
|
||||||
There's also an additional eBook focusing on Containers/Docker lifecycle (DevOps, CI/CD, etc.) with Microsoft Tools, already published.
|
|
||||||
You can start reviewing these Guides/eBooks here:
|
|
||||||
<p>
|
|
||||||
You can download both eBooks from here:
|
|
||||||
|
|
||||||
| Architecting & Developing | Containers Lifecycle & CI/CD |
|
|
||||||
| ------------ | ------------|
|
|
||||||
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> |
|
|
||||||
| <a href='docs/architecting-and-developing-containerized-and-microservice-based-net-applications-ebook-early-draft.pdf'>Download (Confidential DRAFT until published)</a> | <a href='https://aka.ms/dockerlifecycleebook'>Download</a> |
|
|
||||||
|
|
||||||
|
|
||||||
<p>However, we encourage to review the "Architecting/Developing" eBook because the architectural styles and architectural patterns and technologies explained in the guidance are using this reference application when explaining many sample implementations.
|
|
||||||
|
|
||||||
|
|
||||||
## Overview of the application code
|
|
||||||
In this repo you can find a sample reference application that will help you to understand how to implement a microservice architecture based application using <b>.NET Core</b> and <b>Docker</b>.
|
|
||||||
|
|
||||||
The example business domain or scenario is based on an eShop or eCommerce which is implemented as a multi-container application. Each container is a microservice deployment (like the basket-microservice, catalog-microservice, ordering-microservice and the identity-microservice) which are developed using ASP.NET Core running on .NET Core so they can run either on Linux Containers and Windows Containers.
|
|
||||||
The screenshot below shows the VS Solution structure for those microservices/containers and client apps.
|
|
||||||
- Open <b>eShopOnContainers.sln</b> for a solution containing all the projects (All client apps and services).
|
|
||||||
- Open <b>eShopOnContainers-ServicesAndWebApps.sln</b> for a solution containing just the server-side projects related to the microservices and web applications.
|
|
||||||
- Open <b>eShopOnContainers-MobileApps.sln</b> for a solution containing just the client mobile app projects (Xamarin mobile apps only).
|
|
||||||
|
|
||||||
|
|
||||||
<img src="img/vs-solution-structure.png">
|
|
||||||
|
|
||||||
Finally, those microservices are consumed by multiple client web and mobile apps, as described below.
|
|
||||||
|
|
||||||
<b>*MVC Application (ASP.NET Core)*</b>: Its an MVC 6 application where you can find interesting scenarios on how to consume HTTP-based microservices from C# running in the server side, as it is a typical ASP.NET Core MVC application. Since it is a server-side application, access to other containers/microservices is done within the internal Docker Host network with its internal name resolution.
|
|
||||||
<img src="img/eshop-webmvc-app-screenshot.png">
|
|
||||||
|
|
||||||
<b>*SPA (Single Page Application)*</b>: Providing similar "eShop business functionality" but developed with Angular 2, Typescript and slightly using ASP.NET Core MVC 6. This is another approach for client web applications to be used when you want to have a more modern client behavior which is not behaving with the typical browser round-trip on every action but behaving like a Single-Page-Application which is more similar to a desktop app usage experience. The consumption of the HTTP-based microservices is done from TypeScript/JavaScript in the client browser, so the client calls to the microservices come from out of the Docker Host internal network (Like from your network or even from the Internet).
|
|
||||||
<img src="img/eshop-webspa-app-screenshot.png">
|
|
||||||
|
|
||||||
<b>*Xamarin Mobile App (For iOS, Android and Windows/UWP)*</b>: It is a client mobile app supporting the most common mobilee OS platforms (iOS, Android and Windows/UWP). In this case, the consumption of the microservices is done from C# but running on the client devices, so out of the Docker Host internal network (Like from your network or even the Internet).
|
|
||||||
|
|
||||||
<img src="img/xamarin-mobile-App.png">
|
|
||||||
|
|
||||||
> ### Note on tested Docker Containers/Images
|
|
||||||
> The development and testing of this project was (as of January 2017) done <b>only on Docker Linux containers</b> running in development machines with "Docker for Windows" and the default Hyper-V Linux VM (MobiLinuxVM) installed by "Docker for Windows".
|
|
||||||
The <b>Windows Containers scenario has not been implemented/tested yet</b>, but the application should be able to run on Windows Containers based on different Docker base images, as well, as the .NET Core services have also been tested running on plain Windows (with no Docker).
|
|
||||||
The app was also partially tested on "Docker for Mac" using a development MacOS machine with .NET Core and VS Code installed. However, that is still a scenario using Linux containers running on the VM setup in the Mac by the "Docker for Windows" setup.
|
|
||||||
|
|
||||||
## Setting up your development environment for eShopOnContainers
|
|
||||||
### Visual Studio 2017 and Windows based
|
|
||||||
This is the more straightforward way to get started:
|
|
||||||
https://github.com/dotnet/eShopOnContainers/wiki/02.-Setting-eShopOnContainer-solution-up-in-a-Visual-Studio-2017-environment
|
|
||||||
|
|
||||||
### CLI and Windows based
|
|
||||||
For those who prefer the CLI on Windows, using dotnet CLI, docker CLI and VS Code for Windows:
|
|
||||||
https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
|
||||||
|
|
||||||
### CLI and Mac based
|
|
||||||
For those who prefer the CLI on a Mac, using dotnet CLI, docker CLI and VS Code for Mac:
|
|
||||||
https://github.com/dotnet/eShopOnContainers/wiki/04.-Setting-eShopOnContainer-solution-up-in-a-Mac,-VS-Code-and-CLI-environment--(dotnet-CLI,-Docker-CLI-and-VS-Code)
|
|
||||||
|
|
||||||
> ### Note on Windows Containers
|
|
||||||
> As mentioned, the development and testing of this project (January 2017 version) was done on Docker Linux containers running in development machines with "Docker for Windows" and the default Hyper-V Linux VM (MobiLinuxVM) installed by "Docker for Windows".
|
|
||||||
In order to run the application on Windows Containers you'd need to change the base images used by each container:
|
|
||||||
> - Official .NET Core base-image for Windows Containers, at Docker Hub: https://hub.docker.com/r/microsoft/dotnet/ (Using the Windows Nanoserver tag)
|
|
||||||
> - Official base-image for SQL Server on Windows Containers, at Docker Hub: https://hub.docker.com/r/microsoft/mssql-server-windows
|
|
39
cli-linux/build-bits-linux.sh
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
projectList=(
|
||||||
|
"/src/Services/Catalog/Catalog.API"
|
||||||
|
"/src/Services/Basket/Basket.API"
|
||||||
|
"/src/Services/Ordering/Ordering.API"
|
||||||
|
"/src/Services/Identity/Identity.API"
|
||||||
|
"/src/Web/WebMVC"
|
||||||
|
"/src/Web/WebSPA"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build SPA app
|
||||||
|
pushd $(pwd)/src/Web/WebSPA
|
||||||
|
npm rebuild node-sass
|
||||||
|
npm run build:prod
|
||||||
|
|
||||||
|
for project in "${projectList[@]}"
|
||||||
|
do
|
||||||
|
echo -e "\e[33mWorking on $(pwd)/$project"
|
||||||
|
echo -e "\e[33m\tRemoving old publish output"
|
||||||
|
pushd $(pwd)/$project
|
||||||
|
rm -rf obj/Docker/publish
|
||||||
|
echo -e "\e[33m\tRestoring project"
|
||||||
|
dotnet restore
|
||||||
|
echo -e "\e[33m\tBuilding and publishing projects"
|
||||||
|
dotnet publish -o obj/Docker/publish
|
||||||
|
popd
|
||||||
|
done
|
||||||
|
|
||||||
|
# remove old docker images:
|
||||||
|
#images=$(docker images --filter=reference="eshop/*" -q)
|
||||||
|
#if [ -n "$images" ]; then
|
||||||
|
# docker rm $(docker ps -a -q) -f
|
||||||
|
# echo "Deleting eShop images in local Docker repo"
|
||||||
|
# echo $images
|
||||||
|
# docker rmi $(docker images --filter=reference="eshop/*" -q) -f
|
||||||
|
#fi
|
||||||
|
|
||||||
|
# No need to build the images, docker build or docker compose will
|
||||||
|
# do that using the images and containers defined in the docker-compose.yml file.
|
@ -1,3 +1,9 @@
|
|||||||
|
|
||||||
|
#########################################################################################################
|
||||||
|
# This "expanded Script" can be used when debugging issues when building the .NET Core bits
|
||||||
|
# as it is easier to follow and debug than when using a loop (like in the optimized build-bits.ps1)
|
||||||
|
#########################################################################################################
|
||||||
|
|
||||||
Param([string] $rootPath)
|
Param([string] $rootPath)
|
||||||
$scriptPath = Split-Path $script:MyInvocation.MyCommand.Path
|
$scriptPath = Split-Path $script:MyInvocation.MyCommand.Path
|
||||||
|
|
20
cli-windows/build-bits-simple.ps1
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# This approach still has issues, but would be the simplest approach for this script
|
||||||
|
# See: https://github.com/dotnet/eShopOnContainers/issues/74
|
||||||
|
|
||||||
|
Param([string] $rootPath)
|
||||||
|
$scriptPath = Split-Path $script:MyInvocation.MyCommand.Path
|
||||||
|
|
||||||
|
Write-Host "Current script directory is $scriptPath" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
if ([string]::IsNullOrEmpty($rootPath)) {
|
||||||
|
$rootPath = "$scriptPath\.."
|
||||||
|
}
|
||||||
|
Write-Host "Root path used is $rootPath" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
|
||||||
|
$SolutionFilePath = $rootPath + "eShopOnContainers-ServicesAndWebApps.sln"
|
||||||
|
|
||||||
|
dotnet restore $SolutionFilePath
|
||||||
|
|
||||||
|
dotnet publish $SolutionFilePath -c Release -o .\obj\Docker\publish
|
||||||
|
|
9
docker-compose.local.build.yml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
version: '2'
|
||||||
|
|
||||||
|
services:
|
||||||
|
ci-build:
|
||||||
|
image: microsoft/aspnetcore-build-nightly:1.0-1.1
|
||||||
|
volumes:
|
||||||
|
- .:/src
|
||||||
|
working_dir: /src
|
||||||
|
command: /bin/bash -c "chmod -x ./cli-linux/build-bits-linux.sh && ./cli-linux/build-bits-linux.sh"
|
@ -5,8 +5,8 @@ services:
|
|||||||
basket.api:
|
basket.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5103
|
||||||
- ConnectionString=basket.data
|
- ConnectionString=basket.data
|
||||||
#- identityUrl=http://13.88.8.119:5105 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- identityUrl=http://identity.api:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
- identityUrl=http://identity.api:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
ports:
|
ports:
|
||||||
- "5103:5103"
|
- "5103:5103"
|
||||||
@ -14,8 +14,8 @@ services:
|
|||||||
catalog.api:
|
catalog.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5101
|
||||||
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word
|
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word
|
||||||
#- ExternalCatalogBaseUrl=http://13.88.8.119:5101 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- ExternalCatalogBaseUrl=http://localhost:5101 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
- ExternalCatalogBaseUrl=http://localhost:5101 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
ports:
|
ports:
|
||||||
- "5101:5101"
|
- "5101:5101"
|
||||||
@ -23,9 +23,9 @@ services:
|
|||||||
identity.api:
|
identity.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5105
|
||||||
- SpaClient=http://localhost:5104
|
- SpaClient=http://localhost:5104
|
||||||
- ConnectionStrings__DefaultConnection=Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word
|
- ConnectionStrings__DefaultConnection=Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word
|
||||||
#- MvcClient=http://13.88.8.119:5100 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- MvcClient=http://localhost:5100 #Local: You need to open your local dev-machine firewall at range 5100-5105.
|
- MvcClient=http://localhost:5100 #Local: You need to open your local dev-machine firewall at range 5100-5105.
|
||||||
ports:
|
ports:
|
||||||
- "5105:5105"
|
- "5105:5105"
|
||||||
@ -33,8 +33,8 @@ services:
|
|||||||
ordering.api:
|
ordering.api:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5102
|
||||||
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
|
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
|
||||||
#- identityUrl=http://13.88.8.119:5105 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- identityUrl=http://identity.api:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
- identityUrl=http://identity.api:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
ports:
|
ports:
|
||||||
- "5102:5102"
|
- "5102:5102"
|
||||||
@ -42,9 +42,9 @@ services:
|
|||||||
webspa:
|
webspa:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5104
|
||||||
- CatalogUrl=http://localhost:5101
|
- CatalogUrl=http://localhost:5101
|
||||||
- OrderingUrl=http://localhost:5102
|
- OrderingUrl=http://localhost:5102
|
||||||
#- IdentityUrl=http://13.88.8.119:5105 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- IdentityUrl=http://localhost:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
- IdentityUrl=http://localhost:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
- BasketUrl=http://localhost:5103
|
- BasketUrl=http://localhost:5103
|
||||||
ports:
|
ports:
|
||||||
@ -53,9 +53,9 @@ services:
|
|||||||
webmvc:
|
webmvc:
|
||||||
environment:
|
environment:
|
||||||
- ASPNETCORE_ENVIRONMENT=Development
|
- ASPNETCORE_ENVIRONMENT=Development
|
||||||
|
- ASPNETCORE_URLS=http://0.0.0.0:5100
|
||||||
- CatalogUrl=http://catalog.api:5101
|
- CatalogUrl=http://catalog.api:5101
|
||||||
- OrderingUrl=http://ordering.api:5102
|
- OrderingUrl=http://ordering.api:5102
|
||||||
#- IdentityUrl=http://13.88.8.119:5105 #Remote: VM Needs to have public access at 5105.
|
|
||||||
- IdentityUrl=http://10.0.75.1:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
- IdentityUrl=http://10.0.75.1:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
|
||||||
- BasketUrl=http://basket.api:5103
|
- BasketUrl=http://basket.api:5103
|
||||||
ports:
|
ports:
|
||||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 33 KiB |
@ -1,10 +1,6 @@
|
|||||||
using System;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using System.IO;
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Services.Basket.API
|
namespace Microsoft.eShopOnContainers.Services.Basket.API
|
||||||
{
|
{
|
||||||
@ -15,7 +11,6 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API
|
|||||||
var host = new WebHostBuilder()
|
var host = new WebHostBuilder()
|
||||||
.UseKestrel()
|
.UseKestrel()
|
||||||
.UseContentRoot(Directory.GetCurrentDirectory())
|
.UseContentRoot(Directory.GetCurrentDirectory())
|
||||||
.UseUrls("http://0.0.0.0:5103")
|
|
||||||
.UseIISIntegration()
|
.UseIISIntegration()
|
||||||
.UseStartup<Startup>()
|
.UseStartup<Startup>()
|
||||||
.Build();
|
.Build();
|
||||||
|
@ -2,23 +2,8 @@
|
|||||||
Sample reference containerized application, cross-platform and microservices architecture.
|
Sample reference containerized application, cross-platform and microservices architecture.
|
||||||
Powered by Microsoft
|
Powered by Microsoft
|
||||||
|
|
||||||
#Overview
|
Check procedures on how to get it started at the Wiki:
|
||||||
This sample runs a microservices oriented application and an ASP.NET Core MVC application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution.
|
https://github.com/dotnet/eShopOnContainers/wiki
|
||||||
|
|
||||||
#Deploy
|
|
||||||
In the global directory you will find the scripts needed to run and deploy the demo into your local docker infrastructure.
|
|
||||||
|
|
||||||
- <a href='build-image-services-basket.ps1'>build-image-services-basket.ps1</a> <b>Build .net applications and docker images</b>: This PowerShell script that you will find in the <u>root directory of the solution</u> is responsible for building .NET applications and package in a pub folder and use docker commands to build the images needed to run the previously packaged .NET applications.
|
|
||||||
|
|
||||||
- <b>Compose containers in your docker local VM</b>: Finally you have to open your favorite command tool pointing to the <u>root directory of this project</u> where docker-compose.yml file is located and run the command `docker-compose up`
|
|
||||||
|
|
||||||
#Run
|
|
||||||
Once the deploy process of docker-compose finishes you have to be able to access the services in these urls:
|
|
||||||
- Basket service: http://localhost:5103
|
|
||||||
- Identity service: http://localhost:5105
|
|
||||||
- Basket data (Redis): listening in localhost:6379
|
|
||||||
- Identity data (SQL Server): Server=localhost,5433;Database=aspnet-Microsoft.eShopOnContainers;User Id=sa;Password=Pass@word
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers
|
|||||||
((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET api/v1/[controller]/items/[?pageSize=3&pageIndex=10]
|
// GET api/v1/[controller]/items[?pageSize=3&pageIndex=10]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("[action]")]
|
[Route("[action]")]
|
||||||
public async Task<IActionResult> Items(int pageSize = 10, int pageIndex = 0)
|
public async Task<IActionResult> Items([FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0)
|
||||||
{
|
{
|
||||||
var totalItems = await _context.CatalogItems
|
var totalItems = await _context.CatalogItems
|
||||||
.LongCountAsync();
|
.LongCountAsync();
|
||||||
@ -46,10 +46,10 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers
|
|||||||
return Ok(model);
|
return Ok(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET api/v1/[controller]/items/withname/samplename
|
// GET api/v1/[controller]/items/withname/samplename[?pageSize=3&pageIndex=10]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("[action]/withname/{name:minlength(1)}")]
|
[Route("[action]/withname/{name:minlength(1)}")]
|
||||||
public async Task<IActionResult> Items(string name, int pageSize = 10, int pageIndex = 0)
|
public async Task<IActionResult> Items(string name, [FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
var totalItems = await _context.CatalogItems
|
var totalItems = await _context.CatalogItems
|
||||||
@ -70,10 +70,10 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers
|
|||||||
return Ok(model);
|
return Ok(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET api/v1/[controller]/items/type/1/brand/null
|
// GET api/v1/[controller]/items/type/1/brand/null[?pageSize=3&pageIndex=10]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("[action]/type/{catalogTypeId}/brand/{catalogBrandId}")]
|
[Route("[action]/type/{catalogTypeId}/brand/{catalogBrandId}")]
|
||||||
public async Task<IActionResult> Items(int? catalogTypeId, int? catalogBrandId, int pageSize = 10, int pageIndex = 0)
|
public async Task<IActionResult> Items(int? catalogTypeId, int? catalogBrandId, [FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0)
|
||||||
{
|
{
|
||||||
var root = (IQueryable<CatalogItem>)_context.CatalogItems;
|
var root = (IQueryable<CatalogItem>)_context.CatalogItems;
|
||||||
|
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
using System;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using System.IO;
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Services.Catalog.API
|
namespace Microsoft.eShopOnContainers.Services.Catalog.API
|
||||||
{
|
{
|
||||||
@ -14,7 +10,6 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API
|
|||||||
{
|
{
|
||||||
var host = new WebHostBuilder()
|
var host = new WebHostBuilder()
|
||||||
.UseKestrel()
|
.UseKestrel()
|
||||||
.UseUrls("http://0.0.0.0:5101")
|
|
||||||
.UseIISIntegration()
|
.UseIISIntegration()
|
||||||
.UseContentRoot(Directory.GetCurrentDirectory())
|
.UseContentRoot(Directory.GetCurrentDirectory())
|
||||||
.UseWebRoot("Pics")
|
.UseWebRoot("Pics")
|
||||||
|
@ -2,20 +2,8 @@
|
|||||||
Sample reference containerized application, cross-platform and microservices architecture.
|
Sample reference containerized application, cross-platform and microservices architecture.
|
||||||
Powered by Microsoft
|
Powered by Microsoft
|
||||||
|
|
||||||
#Overview
|
Check procedures on how to get it started at the Wiki:
|
||||||
This sample runs a microservices oriented application and an ASP.NET Core MVC application that consumes these services. You can find more information about how to set up docker in your machine in the global directory solution.
|
https://github.com/dotnet/eShopOnContainers/wiki
|
||||||
|
|
||||||
#Deploy
|
|
||||||
In the global directory you will find the scripts needed to run and deploy the demo into your local docker infrastructure.
|
|
||||||
|
|
||||||
- <a href='build-image-services-catalog.ps1'>build-image-services-catalog.ps1</a> <b>Build .net applications and docker images</b>: This PowerShell script that you will find in the <u>root directory of the solution</u> is responsible for building .NET applications and package in a pub folder and use docker commands to build the images needed to run the previously packaged .NET applications.
|
|
||||||
|
|
||||||
- <b>Compose containers in your docker local VM</b>: Finally you have to open your favourite command tool pointing to the <u>root directory of this project</u> where docker-compose.yml file is located and run the command `docker-compose up`
|
|
||||||
|
|
||||||
#Run
|
|
||||||
Once the deploy process of docker-compose finishes you have to be able to access the services in this urls:
|
|
||||||
- Catalog service: http://localhost:5101
|
|
||||||
- Catalog data (SQL Server): Server=tcp:localhost,5434;Database=CatalogDB;User Id=sa;Password=Pass@word
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,11 +42,10 @@
|
|||||||
services.AddDbContext<CatalogContext>(c =>
|
services.AddDbContext<CatalogContext>(c =>
|
||||||
{
|
{
|
||||||
c.UseSqlServer(Configuration["ConnectionString"]);
|
c.UseSqlServer(Configuration["ConnectionString"]);
|
||||||
c.ConfigureWarnings(wb =>
|
// Changing default behavior when client evaluation occurs to throw.
|
||||||
{
|
// Default in EF Core would be to log a warning when client evaluation is performed.
|
||||||
//By default, in this application, we don't want to have client evaluations
|
c.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
|
||||||
wb.Log(RelationalEventId.QueryClientEvaluationWarning);
|
//Check Client vs. Server evaluation: https://docs.microsoft.com/en-us/ef/core/querying/client-eval
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
services.Configure<Settings>(Configuration);
|
services.Configure<Settings>(Configuration);
|
||||||
|
@ -14,18 +14,17 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Update="wwwroot;">
|
<None Include="wwwroot\css\*.min.css" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<None Include="wwwroot\fonts\**\*" CopyToPublishDirectory="PreserveNewest" />
|
||||||
</Content>
|
<None Include="wwwroot\images\**\*" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<Content Update="Views\**\*;">
|
<None Include="wwwroot\js\*.min.js" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<None Include="wwwroot\*.*" CopyToPublishDirectory="PreserveNewest" />
|
||||||
</Content>
|
<None Include="wwwroot\lib\bootstrap\dist\**\*.min.*" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<Content Update="web.config;">
|
<None Include="wwwroot\lib\jquery*\**\*.min.*" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<Content Update="wwwroot\**\*;" CopyToPublishDirectory="Never" />
|
||||||
</Content>
|
<Content Update="Views\**\*;" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<Content Include=".dockerignore">
|
<Content Update="web.config" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
<Content Update=".dockerignore" CopyToPublishDirectory="PreserveNewest" />
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -61,12 +60,12 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
||||||
<Exec Command="bower install" />
|
<Exec Command="bower install --allow-root" />
|
||||||
<Exec Command="dotnet bundle" />
|
<Exec Command="dotnet bundle" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<DotNetCliToolReference Include="BundlerMinifier.Core" Version="2.2.301" />
|
<DotNetCliToolReference Include="BundlerMinifier.Core" Version="2.4.337" />
|
||||||
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0-msbuild3-final" />
|
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0-msbuild3-final" />
|
||||||
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.0-msbuild3-final" />
|
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.0-msbuild3-final" />
|
||||||
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
|
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
|
||||||
@ -78,4 +77,8 @@
|
|||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="wwwroot\css\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
using System;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
|
|
||||||
namespace eShopOnContainers.Identity
|
namespace eShopOnContainers.Identity
|
||||||
{
|
{
|
||||||
@ -13,7 +9,6 @@ namespace eShopOnContainers.Identity
|
|||||||
{
|
{
|
||||||
var host = new WebHostBuilder()
|
var host = new WebHostBuilder()
|
||||||
.UseKestrel()
|
.UseKestrel()
|
||||||
.UseUrls("http://0.0.0.0:5105")
|
|
||||||
.UseContentRoot(Directory.GetCurrentDirectory())
|
.UseContentRoot(Directory.GetCurrentDirectory())
|
||||||
.UseIISIntegration()
|
.UseIISIntegration()
|
||||||
.UseStartup<Startup>()
|
.UseStartup<Startup>()
|
||||||
|
@ -5,21 +5,10 @@ Powered by Microsoft
|
|||||||
#Overview
|
#Overview
|
||||||
This sample runs a microservices oriented application and a .net core Mvc application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution.
|
This sample runs a microservices oriented application and a .net core Mvc application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution.
|
||||||
|
|
||||||
#Considerations
|
#Setup
|
||||||
This service is a identity provider implemented with identity server 4, to implement this scenario is needed a public authority so to complete this flow in our local docker infrastructure we have to add a entry in our host file (windows) or equivalent in other platforms:
|
This service is a identity provider or STS (Security Token Service) currently implemented with IdentityServer 4 wrapping ASP.NET Identity underneath.
|
||||||
|
|
||||||
identity.service 127.0.0.1
|
Check procedures on how to get the sample app started at the Wiki:
|
||||||
|
https://github.com/dotnet/eShopOnContainers/wiki
|
||||||
|
|
||||||
In the root directory of this solution you'll find add-host.ps1 script that does this work for you (requires elevation permission).
|
|
||||||
|
|
||||||
#Deploy
|
|
||||||
In the global directory you will find the scripts needed to run and deploy the demo into your local docker infraestructure.
|
|
||||||
|
|
||||||
- <a href='build-image-services-identity.ps1'>build-image-services-identity.ps1</a> <b>Build .net applications and docker images</b>: This power shell script that you will find in the <u>root directory of the solution</u> is the responsible of building .net applications and package in a pub folder and use docker commands to build the images needed to run the previously packaged .net applications.
|
|
||||||
|
|
||||||
- <b>Compose containers in your docker local VM</b>: Finally you have to open your favourite command tool pointing to the <u>root directory of this project</u> where docker-compose.yml file is located and run the command `docker-compose up`
|
|
||||||
|
|
||||||
#Run
|
|
||||||
Once the deploy process of docker-compose finishes you have to be able to access the services in this urls:
|
|
||||||
- Identity service: http://localhost:5105
|
|
||||||
- Identity data (SQL Server): Server=localhost,5433;Database=aspnet-Microsoft.eShopOnContainers;User Id=sa;Password=Pass@word
|
|
||||||
|
@ -6,8 +6,16 @@
|
|||||||
<title>eShopOnContainers Identity</title>
|
<title>eShopOnContainers Identity</title>
|
||||||
<link rel="icon" type="image/x-icon" href="~/favicon.ico" />
|
<link rel="icon" type="image/x-icon" href="~/favicon.ico" />
|
||||||
<link rel="shortcut icon" type="image/x-icon" href="~/favicon.ico" />
|
<link rel="shortcut icon" type="image/x-icon" href="~/favicon.ico" />
|
||||||
<link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.css" />
|
<environment names="Development">
|
||||||
<link rel="stylesheet" href="~/css/site.css" />
|
<link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.css" />
|
||||||
|
<link rel="stylesheet" href="~/css/site.css" />
|
||||||
|
</environment>
|
||||||
|
<environment names="Staging,Production">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.min.css"
|
||||||
|
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
|
||||||
|
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
|
||||||
|
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
|
||||||
|
</environment>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="navbar navbar-inverse navbar-fixed-top es-header">
|
<div class="navbar navbar-inverse navbar-fixed-top es-header">
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"outputFileName": "wwwroot/css/site.min.css",
|
"outputFileName": "wwwroot/css/site.min.css",
|
||||||
// An array of relative input file paths. Globbing patterns supported
|
// An array of relative input file paths. Globbing patterns supported
|
||||||
"inputFiles": [
|
"inputFiles": [
|
||||||
"wwwroot/css/site.css",
|
"wwwroot/css/**/*.css"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -42,13 +42,13 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: Montserrat;
|
font-family: Montserrat;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: url("/fonts/Montserrat-Regular.eot?") format("eot"),url("/fonts/Montserrat-Regular.woff") format("woff"),url("/fonts/Montserrat-Regular.ttf") format("truetype"),url("/fonts/Montserrat-Regular.svg#Montserrat") format("svg")
|
src: url("../fonts/Montserrat-Regular.eot?") format("eot"),url("../fonts/Montserrat-Regular.woff") format("woff"),url("../fonts/Montserrat-Regular.ttf") format("truetype"),url("../fonts/Montserrat-Regular.svg#Montserrat") format("svg")
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: Montserrat;
|
font-family: Montserrat;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: url("/fonts/Montserrat-Bold.eot?") format("eot"),url("/fonts/Montserrat-Bold.woff") format("woff"),url("/fonts/Montserrat-Bold.ttf") format("truetype"),url("/fonts/Montserrat-Bold.svg#Montserrat") format("svg")
|
src: url("../fonts/Montserrat-Bold.eot?") format("eot"),url("../fonts/Montserrat-Bold.woff") format("woff"),url("../fonts/Montserrat-Bold.ttf") format("truetype"),url("../fonts/Montserrat-Bold.svg#Montserrat") format("svg")
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -1,923 +0,0 @@
|
|||||||
body {
|
|
||||||
margin-top: 65px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-header {
|
|
||||||
position:relative;
|
|
||||||
top:-4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand > .icon-banner {
|
|
||||||
position:relative;
|
|
||||||
top:-2px;
|
|
||||||
display:inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
position:relative;
|
|
||||||
top:-10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-consent {
|
|
||||||
.client-logo {
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 80px;
|
|
||||||
height: 80px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.consent-buttons {
|
|
||||||
margin-top: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.consent-form {
|
|
||||||
.consent-scopecheck {
|
|
||||||
display: inline-block;
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.consent-scopecheck[disabled] {
|
|
||||||
//visibility:hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.consent-description {
|
|
||||||
margin-left: 25px;
|
|
||||||
|
|
||||||
label {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.consent-remember {
|
|
||||||
padding-left: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: Montserrat;
|
|
||||||
font-weight: 400;
|
|
||||||
src: url("/fonts/Montserrat-Regular.eot?") format("eot"),url("/fonts/Montserrat-Regular.woff") format("woff"),url("/fonts/Montserrat-Regular.ttf") format("truetype"),url("/fonts/Montserrat-Regular.svg#Montserrat") format("svg")
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: Montserrat;
|
|
||||||
font-weight: 700;
|
|
||||||
src: url("/fonts/Montserrat-Bold.eot?") format("eot"),url("/fonts/Montserrat-Bold.woff") format("woff"),url("/fonts/Montserrat-Bold.ttf") format("truetype"),url("/fonts/Montserrat-Bold.svg#Montserrat") format("svg")
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: Montserrat,sans-serif;
|
|
||||||
min-width:480px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mt-15 {
|
|
||||||
margin-top:15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wrapping element */
|
|
||||||
/* Set some basic padding to keep content from hitting the edges */
|
|
||||||
.body-content {
|
|
||||||
padding-left: 15px;
|
|
||||||
padding-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set widths on the form inputs since otherwise they're 100% wide */
|
|
||||||
input,
|
|
||||||
select,
|
|
||||||
textarea {
|
|
||||||
max-width: 280px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-filter {
|
|
||||||
background-color: transparent;
|
|
||||||
padding: 10px;
|
|
||||||
margin: 10px;
|
|
||||||
margin-right: 20px;
|
|
||||||
color: white;
|
|
||||||
padding-top: 20px;
|
|
||||||
padding-bottom: 3px;
|
|
||||||
min-width: 140px;
|
|
||||||
border-color: #37c7ca;
|
|
||||||
max-height: 43px;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-filter option {
|
|
||||||
background-color: #00a69c;
|
|
||||||
}
|
|
||||||
|
|
||||||
select::-ms-expand {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-filter-wrapper {
|
|
||||||
z-index: 0;
|
|
||||||
display:inline-block;
|
|
||||||
margin-left: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-filter-wrapper::before {
|
|
||||||
content: attr(data-name);
|
|
||||||
opacity: 0.5;
|
|
||||||
z-index: 1;
|
|
||||||
text-transform: uppercase;
|
|
||||||
position: absolute;
|
|
||||||
font-size: 10px;
|
|
||||||
margin-top: 15px;
|
|
||||||
margin-left: 21px;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select-filter-arrow {
|
|
||||||
position: absolute;
|
|
||||||
margin-left: 130px;
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small-filter {
|
|
||||||
margin-top: 10px;
|
|
||||||
position: absolute;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Carousel */
|
|
||||||
.carousel-caption p {
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 1.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-cart-image {
|
|
||||||
height: 36px;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-cart-badge {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: 2px;
|
|
||||||
margin-left: 14px;
|
|
||||||
background-color: #83d01b;
|
|
||||||
padding: 1px;
|
|
||||||
color: white;
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 18px;
|
|
||||||
height: 18px;
|
|
||||||
font-size: 12px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* buttons and links extension to use brackets: [ click me ] */
|
|
||||||
.btn-bracketed:hover:before {
|
|
||||||
display: inline-block;
|
|
||||||
content: "[";
|
|
||||||
padding-right: 0.5em;
|
|
||||||
color: chartreuse;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-bracketed:hover:after {
|
|
||||||
display: inline-block;
|
|
||||||
content: "]";
|
|
||||||
padding-left: 0.5em;
|
|
||||||
color: chartreuse;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand {
|
|
||||||
background-color: #83D01B;
|
|
||||||
color: white;
|
|
||||||
padding: 10px 20px 10px 20px;
|
|
||||||
border-radius: 0px;
|
|
||||||
border: none;
|
|
||||||
width: 255px;
|
|
||||||
display: inline-block;
|
|
||||||
text-align: center;
|
|
||||||
text-transform: uppercase;
|
|
||||||
height: 45px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand::before {
|
|
||||||
content: '['
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand::after {
|
|
||||||
content: ']'
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand:hover:before {
|
|
||||||
padding-right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand:hover:after {
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-big {
|
|
||||||
width: 360px;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small {
|
|
||||||
width: 45px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small::before {
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small::after {
|
|
||||||
content: '';
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small:hover:before {
|
|
||||||
content: '';
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-small:hover:after {
|
|
||||||
content: '';
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-dark {
|
|
||||||
background-color: #00a69c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand:hover {
|
|
||||||
color: white;
|
|
||||||
background-color: #83D01B;
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-brand-dark:hover {
|
|
||||||
background-color: #00a69c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-cart {
|
|
||||||
float: right;
|
|
||||||
margin-top: 40px;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-catalog-apply {
|
|
||||||
padding:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-label {
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: normal!important;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 10px !important;
|
|
||||||
color: #404040;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input {
|
|
||||||
border-radius: 0;
|
|
||||||
padding: 10px;
|
|
||||||
height: 45px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input-small {
|
|
||||||
max-width: 100px!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-select {
|
|
||||||
border-radius: 0;
|
|
||||||
padding: 10px;
|
|
||||||
height: 45px;
|
|
||||||
width: 150px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make .svg files in the carousel display properly in older browsers */
|
|
||||||
.carousel-inner .item img[src$=".svg"] {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-inverse {
|
|
||||||
background-color: #FFF;
|
|
||||||
border-color: #FFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*.navbar-inverse li {
|
|
||||||
margin-top: 10px;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
.btn-login {
|
|
||||||
border: 1px solid #00A69C;
|
|
||||||
height: 36px!important;
|
|
||||||
margin-right: 10px;
|
|
||||||
margin-top: 10px;
|
|
||||||
background-color: white;
|
|
||||||
color: #00a69c;
|
|
||||||
text-transform:uppercase;
|
|
||||||
max-width: 140px;
|
|
||||||
width: 140px;
|
|
||||||
padding-top:8px!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login {
|
|
||||||
font-weight:normal!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login::before {
|
|
||||||
content: '[';
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login::after {
|
|
||||||
content: ']';
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login:hover:before {
|
|
||||||
content: '[ ';
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-login:hover:after {
|
|
||||||
content: ' ]';
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-inverse li a {
|
|
||||||
height: 30px;
|
|
||||||
padding: 5px 20px;
|
|
||||||
color: #00A69C !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
margin-top: 20px;
|
|
||||||
background-image: url(../images/brand.PNG);
|
|
||||||
width: 201px;
|
|
||||||
height: 44px;
|
|
||||||
margin-left: 0px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav > li > a {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav > li > a:hover, .nav > li > a:focus {
|
|
||||||
background-color: #00A69C;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-fluid {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-right: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-banner {
|
|
||||||
width: 100%;
|
|
||||||
margin-right: 0px;
|
|
||||||
margin-left: 0px;
|
|
||||||
background-image: url(../images/main_banner.png);
|
|
||||||
background-size: cover;
|
|
||||||
height: 258px;
|
|
||||||
background-position: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-banner-text {
|
|
||||||
margin-top: 70px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-container {
|
|
||||||
min-height: 400px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-filter-container {
|
|
||||||
background-color: #00A69C;
|
|
||||||
height:63px;
|
|
||||||
line-height: 76px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-filter-container li a {
|
|
||||||
padding-top: 5px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-filter-brands::before {
|
|
||||||
content: 'BRAND';
|
|
||||||
color: white;
|
|
||||||
font-size: x-small;
|
|
||||||
opacity: 0.5;
|
|
||||||
margin: 10px 0px 0px 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-filter-types::before {
|
|
||||||
content: 'TYPES';
|
|
||||||
color: white;
|
|
||||||
font-size: x-small;
|
|
||||||
opacity: 0.5;
|
|
||||||
margin: 10px 0px 0px 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-image {
|
|
||||||
width: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
/* max-width: 320px; */
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-image-addCart {
|
|
||||||
background-color: #83D01B;
|
|
||||||
color: white;
|
|
||||||
display: inline-block;
|
|
||||||
height: 43px;
|
|
||||||
padding: 10px 20px 10px 20px;
|
|
||||||
font-weight: bold;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-left: 60px;
|
|
||||||
margin-right: 60px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-image-addCart:hover {
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.home-catalog-item-image:hover:after {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-title {
|
|
||||||
text-align: center;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: 300;
|
|
||||||
font-size: 16px;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-price {
|
|
||||||
text-align: center;
|
|
||||||
font-weight: 900;
|
|
||||||
font-size: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-item-price::before {
|
|
||||||
content: '$';
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-catalog-noResults {
|
|
||||||
text-align:center;
|
|
||||||
margin-top: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container .nav .navbar-nav .col-sm-6 ::before {
|
|
||||||
content: 'BRAND';
|
|
||||||
}
|
|
||||||
|
|
||||||
.validation-summary-errors li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
background-color: black;
|
|
||||||
height: 150px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer .brand {
|
|
||||||
margin-top: 25px;
|
|
||||||
background-image: url(../images/brand_dark.PNG);
|
|
||||||
max-width: 231px;
|
|
||||||
height: 52px;
|
|
||||||
margin-left: 0px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer .text {
|
|
||||||
text-align: right;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
color: #83D01B;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text {
|
|
||||||
color: #83D01B;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text:hover {
|
|
||||||
color: #83D01B;
|
|
||||||
}
|
|
||||||
|
|
||||||
form .col-md-4 {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block {
|
|
||||||
background-color: #00A69C;
|
|
||||||
height: 63px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block li {
|
|
||||||
list-style: none;
|
|
||||||
display: inline;
|
|
||||||
opacity: 0.5;
|
|
||||||
margin-top: 25px;
|
|
||||||
margin-left: 10px;
|
|
||||||
/*float: right;*/
|
|
||||||
cursor: pointer;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block li a {
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block li a:hover {
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block .active {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block .active::before {
|
|
||||||
content: '[ ';
|
|
||||||
color: greenyellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-block .active::after {
|
|
||||||
content: ' ]';
|
|
||||||
color: greenyellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.brand-header-back {
|
|
||||||
float: left!important;
|
|
||||||
margin-top: 20px!important;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-login-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-register-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
text-align: center !important;
|
|
||||||
align-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-index-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding-top: 40px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
min-width: 992px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.register-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding-top: 40px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
padding-left: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-create-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding-top: 40px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
padding-left: 30px;
|
|
||||||
min-width: 995px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-product-column {
|
|
||||||
max-width: 120px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
vertical-align: middle!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-create-container .cart-product-column {
|
|
||||||
max-width: 130px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-product-column-name {
|
|
||||||
width: 220px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-subtotal-label {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #404040;
|
|
||||||
margin-top:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-subtotal-value {
|
|
||||||
font-size: 20px;
|
|
||||||
color: #00a69c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-total-label {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #404040;
|
|
||||||
margin-top:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-total-value {
|
|
||||||
font-size: 28px;
|
|
||||||
color: #00a69c;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-product-image {
|
|
||||||
max-width: 210px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-section-total {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
margin-left: 175px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-product-column input {
|
|
||||||
width: 70px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-refresh-button {
|
|
||||||
margin-top:0;
|
|
||||||
background-image: url('../images/refresh.svg');
|
|
||||||
color: white;
|
|
||||||
font-size: 8px;
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
background-color:transparent;
|
|
||||||
border:none;
|
|
||||||
margin-top: 25px;
|
|
||||||
margin-left:15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-refresh-button:hover {
|
|
||||||
background-color:transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-totals {
|
|
||||||
border-bottom:none!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-validation-error {
|
|
||||||
border: 1px solid #fb0d0d;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-danger {
|
|
||||||
color: #fb0d0d;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart {
|
|
||||||
border: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-horizontal h4 {
|
|
||||||
margin-top: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-horizontal .form-group {
|
|
||||||
margin-right: 0px!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-control:focus {
|
|
||||||
border-color: #83d01b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-input-center {
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-index-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding-top: 40px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-index-container .table tbody tr {
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-index-container .table tbody tr td {
|
|
||||||
border-top:none;
|
|
||||||
padding-top:10px;
|
|
||||||
padding-bottom:10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.order-index-container .table tbody tr:nth-child(even) {
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-create-section-title {
|
|
||||||
margin-left: -15px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-create-section-items {
|
|
||||||
margin-left: -45px;
|
|
||||||
width: 102%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-button {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-button a {
|
|
||||||
color: #83d01b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-container {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding-top: 40px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-container .table tbody tr:first-child td{
|
|
||||||
border-top:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-container .table tr{
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-section {
|
|
||||||
margin-top: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-detail-container .table {
|
|
||||||
margin-left: -7px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-section-total {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
margin-left: 40px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fr {
|
|
||||||
float:right!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.down-arrow {
|
|
||||||
background-image: url('../images/arrow-down.png');
|
|
||||||
height: 7px;
|
|
||||||
width: 10px;
|
|
||||||
display: inline-block;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logout-icon {
|
|
||||||
background-image: url('../images/logout.PNG');
|
|
||||||
display: inline-block;
|
|
||||||
height:19px;
|
|
||||||
width:19px;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myorders-icon {
|
|
||||||
background-image: url('../images/my_orders.PNG');
|
|
||||||
display: inline-block;
|
|
||||||
height: 20px;
|
|
||||||
width: 20px;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user {
|
|
||||||
position: absolute!important;
|
|
||||||
top: 30px;
|
|
||||||
right: 65px;
|
|
||||||
cursor:pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user-dropdown {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user-dropdown-content {
|
|
||||||
display: none;
|
|
||||||
position: absolute;
|
|
||||||
background-color: #FFFFFF;
|
|
||||||
min-width: 160px;
|
|
||||||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
|
||||||
/*left: 100px;*/
|
|
||||||
right: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user-dropdown-content a {
|
|
||||||
color: black;
|
|
||||||
padding: 12px 16px;
|
|
||||||
text-decoration: none;
|
|
||||||
display: block;
|
|
||||||
text-align:right;
|
|
||||||
text-transform:uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user:hover .login-user-dropdown-content {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.down-arrow:hover > .login-user-dropdown-content {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-user-dropdown-content a:hover {
|
|
||||||
color: #83d01b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.es-header {
|
|
||||||
min-height: 80px!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.es-pager-bottom {
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.es-pager-top {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.es-pager-top ul {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.es-pager-bottom ul {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-item {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.next {
|
|
||||||
position: absolute;
|
|
||||||
right: 15px;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.previous {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.is-disabled{
|
|
||||||
cursor: not-allowed;
|
|
||||||
opacity: .5;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table tr {
|
|
||||||
border-bottom:1px solid #ddd;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table th {
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.navbar-nav {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 7.5px;
|
|
||||||
margin-right: -10px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1195px) {
|
|
||||||
.cart-product-column-name {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hide/rearrange for smaller screens */
|
|
||||||
@media screen and (max-width: 767px) {
|
|
||||||
/* Hide captions */
|
|
||||||
.carousel-caption {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer .text {
|
|
||||||
text-align: left;
|
|
||||||
margin-top: -15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-product-column-brand {
|
|
||||||
display:none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 992px) {
|
|
||||||
.form-input {
|
|
||||||
width: 360px;
|
|
||||||
max-width: 360px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System.Runtime.Serialization;
|
|||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
|
||||||
{
|
{
|
||||||
// DDD and CQRS patterns comment: Note that it is recommened to implement immutable Commands
|
// DDD and CQRS patterns comment: Note that it is recommended to implement immutable Commands
|
||||||
// In this case, its immutability is achieved by having all the setters as private
|
// In this case, its immutability is achieved by having all the setters as private
|
||||||
// plus only being able to update the data just once, when creating the object through its constructor.
|
// plus only being able to update the data just once, when creating the object through its constructor.
|
||||||
// References on Immutable Commands:
|
// References on Immutable Commands:
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
using System;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using System.IO;
|
||||||
|
|
||||||
namespace Microsoft.eShopOnContainers.Services.Ordering.API
|
namespace Microsoft.eShopOnContainers.Services.Ordering.API
|
||||||
{
|
{
|
||||||
@ -15,7 +11,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API
|
|||||||
var host = new WebHostBuilder()
|
var host = new WebHostBuilder()
|
||||||
.UseKestrel()
|
.UseKestrel()
|
||||||
.UseContentRoot(Directory.GetCurrentDirectory())
|
.UseContentRoot(Directory.GetCurrentDirectory())
|
||||||
.UseUrls("http://0.0.0.0:5102")
|
|
||||||
.UseIISIntegration()
|
.UseIISIntegration()
|
||||||
.UseStartup<Startup>()
|
.UseStartup<Startup>()
|
||||||
.Build();
|
.Build();
|
||||||
|
@ -2,23 +2,8 @@
|
|||||||
Sample reference containerized application, cross-platform and microservices architecture.
|
Sample reference containerized application, cross-platform and microservices architecture.
|
||||||
Powered by Microsoft
|
Powered by Microsoft
|
||||||
|
|
||||||
#Overview
|
Check procedures on how to get it started at the Wiki:
|
||||||
This sample runs a microservices oriented application and a .net core Mvc application that consumes this services. You can find more information about how to set up docker in your machine in the global directory solution.
|
https://github.com/dotnet/eShopOnContainers/wiki
|
||||||
|
|
||||||
#Deploy
|
|
||||||
In the global directory you will find the scripts needed to run and deploy the demo into your local docker infraestructure.
|
|
||||||
|
|
||||||
- <a href='build-image-services-orders.ps1'>build-image-services-orders.ps1</a> <b>Build .net applications and docker images</b>: This power shell script that you will find in the <u>root directory of the solution</u> is the responsible of building .net applications and package in a pub folder and use docker commands to build the images needed to run the previously packaged .net applications.
|
|
||||||
|
|
||||||
- <b>Compose containers in your docker local VM</b>: Finally you have to open your favourite command tool pointing to the <u>root directory of this project</u> where docker-compose.yml file is located and run the command `docker-compose up`
|
|
||||||
|
|
||||||
#Run
|
|
||||||
Once the deploy process of docker-compose finishes you have to be able to access the services in this urls:
|
|
||||||
- Orders service: http://localhost:5102
|
|
||||||
- Identity service: http://localhost:5105
|
|
||||||
- Orders data (SQL Server): Server=tcp:localhost,5432;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;
|
|
||||||
- Identity data (SQL Server): Server=localhost,5433;Database=aspnet-Microsoft.eShopOnContainers;User Id=sa;Password=Pass@word
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
38
src/Web/Catalog.WebForms/Catalog.WebForms.sln
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.26228.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Catalog.WebForms", "Catalog.WebForms\Catalog.WebForms.csproj", "{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}"
|
||||||
|
EndProject
|
||||||
|
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{7816BBB6-20B9-4D5A-864D-47B7C6E3D3D5}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB} = {07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}
|
||||||
|
{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD} = {9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Catalog.API", "..\..\Services\Catalog\Catalog.API\Catalog.API.csproj", "{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7816BBB6-20B9-4D5A-864D-47B7C6E3D3D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7816BBB6-20B9-4D5A-864D-47B7C6E3D3D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7816BBB6-20B9-4D5A-864D-47B7C6E3D3D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7816BBB6-20B9-4D5A-864D-47B7C6E3D3D5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9B92B9F2-0DB5-4294-8DBF-DE2F87AEADDD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
3
src/Web/Catalog.WebForms/Catalog.WebForms/.dockerignore
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
*
|
||||||
|
!obj\Docker\publish\*
|
||||||
|
!obj\Docker\empty\
|
7
src/Web/Catalog.WebForms/Catalog.WebForms/About.aspx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<%@ Page Title="About" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="Microsoft.eShopOnContainers.Catalog.WebForms.About" %>
|
||||||
|
|
||||||
|
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
|
||||||
|
<h2><%: Title %>.</h2>
|
||||||
|
<h3>Your application description page.</h3>
|
||||||
|
<p>Use this area to provide additional information.</p>
|
||||||
|
</asp:Content>
|
17
src/Web/Catalog.WebForms/Catalog.WebForms/About.aspx.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.UI;
|
||||||
|
using System.Web.UI.WebControls;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public partial class About : Page
|
||||||
|
{
|
||||||
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
src/Web/Catalog.WebForms/Catalog.WebForms/About.aspx.designer.cs
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms {
|
||||||
|
|
||||||
|
|
||||||
|
public partial class About {
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Optimization;
|
||||||
|
using System.Web.UI;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public class BundleConfig
|
||||||
|
{
|
||||||
|
// For more information on Bundling, visit https://go.microsoft.com/fwlink/?LinkID=303951
|
||||||
|
public static void RegisterBundles(BundleCollection bundles)
|
||||||
|
{
|
||||||
|
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
|
||||||
|
"~/Scripts/WebForms/WebForms.js",
|
||||||
|
"~/Scripts/WebForms/WebUIValidation.js",
|
||||||
|
"~/Scripts/WebForms/MenuStandards.js",
|
||||||
|
"~/Scripts/WebForms/Focus.js",
|
||||||
|
"~/Scripts/WebForms/GridView.js",
|
||||||
|
"~/Scripts/WebForms/DetailsView.js",
|
||||||
|
"~/Scripts/WebForms/TreeView.js",
|
||||||
|
"~/Scripts/WebForms/WebParts.js"));
|
||||||
|
|
||||||
|
// Order is very important for these files to work, they have explicit dependencies
|
||||||
|
bundles.Add(new ScriptBundle("~/bundles/MsAjaxJs").Include(
|
||||||
|
"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js",
|
||||||
|
"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js",
|
||||||
|
"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js",
|
||||||
|
"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js"));
|
||||||
|
|
||||||
|
// Use the Development version of Modernizr to develop with and learn from. Then, when you’re
|
||||||
|
// ready for production, use the build tool at https://modernizr.com to pick only the tests you need
|
||||||
|
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
|
||||||
|
"~/Scripts/modernizr-*"));
|
||||||
|
|
||||||
|
System.Web.UI.ScriptManager.ScriptResourceMapping.AddDefinition(
|
||||||
|
"respond",
|
||||||
|
new ScriptResourceDefinition
|
||||||
|
{
|
||||||
|
Path = "~/Scripts/respond.min.js",
|
||||||
|
DebugPath = "~/Scripts/respond.js",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Routing;
|
||||||
|
using Microsoft.AspNet.FriendlyUrls;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public static class RouteConfig
|
||||||
|
{
|
||||||
|
public static void RegisterRoutes(RouteCollection routes)
|
||||||
|
{
|
||||||
|
var settings = new FriendlyUrlSettings();
|
||||||
|
settings.AutoRedirectMode = RedirectMode.Permanent;
|
||||||
|
routes.EnableFriendlyUrls(settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
|
||||||
|
<TelemetryInitializers>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureWebAppRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">
|
||||||
|
<!-- Extended list of bots:
|
||||||
|
search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->
|
||||||
|
<Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>
|
||||||
|
</Add>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web"/>
|
||||||
|
</TelemetryInitializers>
|
||||||
|
<TelemetryModules>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
|
||||||
|
<!--
|
||||||
|
Use the following syntax here to collect additional performance counters:
|
||||||
|
|
||||||
|
<Counters>
|
||||||
|
<Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />
|
||||||
|
...
|
||||||
|
</Counters>
|
||||||
|
|
||||||
|
PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName
|
||||||
|
|
||||||
|
NOTE: performance counters configuration will be lost upon NuGet upgrade.
|
||||||
|
|
||||||
|
The following placeholders are supported as InstanceName:
|
||||||
|
??APP_WIN32_PROC?? - instance name of the application process for Win32 counters.
|
||||||
|
??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.
|
||||||
|
??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.
|
||||||
|
-->
|
||||||
|
</Add>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web">
|
||||||
|
<Handlers>
|
||||||
|
<!--
|
||||||
|
Add entries here to filter out additional handlers:
|
||||||
|
|
||||||
|
NOTE: handler configuration will be lost upon NuGet upgrade.
|
||||||
|
-->
|
||||||
|
<Add>System.Web.Handlers.TransferRequestHandler</Add>
|
||||||
|
<Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>
|
||||||
|
<Add>System.Web.StaticFileHandler</Add>
|
||||||
|
<Add>System.Web.Handlers.AssemblyResourceLoader</Add>
|
||||||
|
<Add>System.Web.Optimization.BundleHandler</Add>
|
||||||
|
<Add>System.Web.Script.Services.ScriptHandlerFactory</Add>
|
||||||
|
<Add>System.Web.Handlers.TraceHandler</Add>
|
||||||
|
<Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>
|
||||||
|
<Add>System.Web.HttpDebugHandler</Add>
|
||||||
|
</Handlers>
|
||||||
|
</Add>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web"/>
|
||||||
|
</TelemetryModules>
|
||||||
|
<TelemetryProcessors>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector"/>
|
||||||
|
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
|
||||||
|
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
|
||||||
|
</Add>
|
||||||
|
</TelemetryProcessors>
|
||||||
|
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
|
||||||
|
<!--
|
||||||
|
Learn more about Application Insights configuration with ApplicationInsights.config here:
|
||||||
|
http://go.microsoft.com/fwlink/?LinkID=513840
|
||||||
|
|
||||||
|
Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.
|
||||||
|
--></ApplicationInsights>
|
7
src/Web/Catalog.WebForms/Catalog.WebForms/Bundle.config
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<bundles version="1.0">
|
||||||
|
<styleBundle path="~/Content/css">
|
||||||
|
<include path="~/Content/bootstrap.css" />
|
||||||
|
<include path="~/Content/Site.css" />
|
||||||
|
</styleBundle>
|
||||||
|
</bundles>
|
@ -0,0 +1,304 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
|
||||||
|
<Import Project="..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props')" />
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>
|
||||||
|
</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{07B42E24-32F8-4C10-99A8-0FB5AC6BFEBB}</ProjectGuid>
|
||||||
|
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>Microsoft.eShopOnContainers.Catalog.WebForms</RootNamespace>
|
||||||
|
<AssemblyName>Catalog.WebForms</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<UseIISExpress>true</UseIISExpress>
|
||||||
|
<IISExpressSSLPort />
|
||||||
|
<IISExpressAnonymousAuthentication />
|
||||||
|
<IISExpressWindowsAuthentication />
|
||||||
|
<IISExpressUseClassicPipelineMode />
|
||||||
|
<UseGlobalApplicationHostFile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Autofac, Version=4.3.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Autofac.4.3.0\lib\net45\Autofac.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Web.Extensions" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Web.Services" />
|
||||||
|
<Reference Include="System.EnterpriseServices" />
|
||||||
|
<Reference Include="System.Web.DynamicData" />
|
||||||
|
<Reference Include="System.Web.Entity" />
|
||||||
|
<Reference Include="System.Web.ApplicationServices" />
|
||||||
|
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<Private>True</Private>
|
||||||
|
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="AspNet.ScriptManager.bootstrap">
|
||||||
|
<HintPath>..\packages\AspNet.ScriptManager.bootstrap.3.0.0\lib\net45\AspNet.ScriptManager.bootstrap.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="AspNet.ScriptManager.jQuery">
|
||||||
|
<HintPath>..\packages\AspNet.ScriptManager.jQuery.1.10.2\lib\net45\AspNet.ScriptManager.jQuery.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.ScriptManager.MSAjax">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\lib\net45\Microsoft.ScriptManager.MSAjax.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.ScriptManager.WebForms">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\lib\net45\Microsoft.ScriptManager.WebForms.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="WebGrease">
|
||||||
|
<Private>True</Private>
|
||||||
|
<HintPath>..\packages\WebGrease.1.5.2\lib\WebGrease.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Antlr3.Runtime">
|
||||||
|
<Private>True</Private>
|
||||||
|
<HintPath>..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AspNet.Web.Optimization.WebForms">
|
||||||
|
<Private>True</Private>
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\lib\net45\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AspNet.FriendlyUrls">
|
||||||
|
<HintPath>..\packages\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\lib\net45\Microsoft.AspNet.FriendlyUrls.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Newtonsoft.Json">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.ApplicationInsights">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.2.2.0\lib\net45\Microsoft.ApplicationInsights.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.Agent.Intercept">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.Agent.Intercept.2.0.6\lib\net45\Microsoft.AI.Agent.Intercept.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.DependencyCollector">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.DependencyCollector.2.2.0\lib\net45\Microsoft.AI.DependencyCollector.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.PerfCounterCollector">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.2.0\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.ServerTelemetryChannel">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.2.0\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.WindowsServer">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.2.2.0\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.AI.Web">
|
||||||
|
<HintPath>..\packages\Microsoft.ApplicationInsights.Web.2.2.0\lib\net45\Microsoft.AI.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="About.aspx" />
|
||||||
|
<Content Include="Contact.aspx" />
|
||||||
|
<Content Include="Content\bootstrap.css" />
|
||||||
|
<Content Include="Content\bootstrap.min.css" />
|
||||||
|
<Content Include="Content\fake_product_01.png" />
|
||||||
|
<Content Include="Content\fake_product_02.png" />
|
||||||
|
<Content Include="Content\fake_product_03.png" />
|
||||||
|
<Content Include="Content\fake_product_04.png" />
|
||||||
|
<Content Include="Content\fake_product_05.png" />
|
||||||
|
<Content Include="Content\Site.css" />
|
||||||
|
<Content Include="Default.aspx" />
|
||||||
|
<Content Include="favicon.ico" />
|
||||||
|
<Content Include="fonts\glyphicons-halflings-regular.svg" />
|
||||||
|
<Content Include="Global.asax" />
|
||||||
|
<Content Include="fonts\glyphicons-halflings-regular.woff" />
|
||||||
|
<Content Include="fonts\glyphicons-halflings-regular.ttf" />
|
||||||
|
<Content Include="fonts\glyphicons-halflings-regular.eot" />
|
||||||
|
<Content Include="ApplicationInsights.config">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<None Include="Dockerfile" />
|
||||||
|
<None Include=".dockerignore">
|
||||||
|
<DependentUpon>Dockerfile</DependentUpon>
|
||||||
|
</None>
|
||||||
|
<None Include="Properties\PublishProfiles\FolderProfile.pubxml" />
|
||||||
|
<None Include="Scripts\jquery-1.10.2.intellisense.js" />
|
||||||
|
<Content Include="Scripts\bootstrap.js" />
|
||||||
|
<Content Include="Scripts\bootstrap.min.js" />
|
||||||
|
<Content Include="Scripts\jquery-1.10.2.js" />
|
||||||
|
<Content Include="Scripts\jquery-1.10.2.min.js" />
|
||||||
|
<Content Include="Scripts\modernizr-2.6.2.js" />
|
||||||
|
<Content Include="Scripts\respond.js" />
|
||||||
|
<Content Include="Scripts\respond.min.js" />
|
||||||
|
<Content Include="Scripts\WebForms\DetailsView.js" />
|
||||||
|
<Content Include="Scripts\WebForms\Focus.js" />
|
||||||
|
<Content Include="Scripts\WebForms\GridView.js" />
|
||||||
|
<Content Include="Scripts\WebForms\Menu.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MenuStandards.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjax.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxApplicationServices.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxComponentModel.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxCore.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxGlobalization.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxHistory.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxNetwork.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxSerialization.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxTimer.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxWebForms.js" />
|
||||||
|
<Content Include="Scripts\WebForms\MSAjax\MicrosoftAjaxWebServices.js" />
|
||||||
|
<Content Include="Scripts\WebForms\SmartNav.js" />
|
||||||
|
<Content Include="Scripts\WebForms\TreeView.js" />
|
||||||
|
<Content Include="Scripts\WebForms\WebForms.js" />
|
||||||
|
<Content Include="Scripts\WebForms\WebParts.js" />
|
||||||
|
<Content Include="Scripts\WebForms\WebUIValidation.js" />
|
||||||
|
<Content Include="Site.Master" />
|
||||||
|
<Content Include="ViewSwitcher.ascx" />
|
||||||
|
<Content Include="Web.config" />
|
||||||
|
<Content Include="Bundle.config" />
|
||||||
|
<Content Include="Site.Mobile.Master" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="App_Start\BundleConfig.cs" />
|
||||||
|
<Compile Include="About.aspx.cs">
|
||||||
|
<DependentUpon>About.aspx</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="About.aspx.designer.cs">
|
||||||
|
<DependentUpon>About.aspx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="App_Start\RouteConfig.cs" />
|
||||||
|
<Compile Include="Contact.aspx.cs">
|
||||||
|
<DependentUpon>Contact.aspx</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Contact.aspx.designer.cs">
|
||||||
|
<DependentUpon>Contact.aspx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Default.aspx.cs">
|
||||||
|
<DependentUpon>Default.aspx</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Default.aspx.designer.cs">
|
||||||
|
<DependentUpon>Default.aspx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Extensions\ObservableExtensions.cs" />
|
||||||
|
<Compile Include="Global.asax.cs">
|
||||||
|
<DependentUpon>Global.asax</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Models\CatalogBrand.cs" />
|
||||||
|
<Compile Include="Models\CatalogItem.cs" />
|
||||||
|
<Compile Include="Models\CatalogRoot.cs" />
|
||||||
|
<Compile Include="Models\CatalogType.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Services\CatalogMockService.cs" />
|
||||||
|
<Compile Include="Services\CatalogService.cs" />
|
||||||
|
<Compile Include="Services\Common.cs" />
|
||||||
|
<Compile Include="Services\ICatalogService.cs" />
|
||||||
|
<Compile Include="Services\IRouteProvider.cs" />
|
||||||
|
<Compile Include="Site.Master.cs">
|
||||||
|
<DependentUpon>Site.Master</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Site.Master.designer.cs">
|
||||||
|
<DependentUpon>Site.Master</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Site.Mobile.Master.cs">
|
||||||
|
<DependentUpon>Site.Mobile.Master</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Site.Mobile.Master.designer.cs">
|
||||||
|
<DependentUpon>Site.Mobile.Master</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="ViewSwitcher.ascx.cs">
|
||||||
|
<DependentUpon>ViewSwitcher.ascx</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="ViewSwitcher.ascx.designer.cs">
|
||||||
|
<DependentUpon>ViewSwitcher.ascx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="App_Data\" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="packages.config" />
|
||||||
|
<Content Include="Scripts\jquery-1.10.2.min.map" />
|
||||||
|
<None Include="Web.Debug.config">
|
||||||
|
<DependentUpon>Web.config</DependentUpon>
|
||||||
|
</None>
|
||||||
|
<None Include="Web.Release.config">
|
||||||
|
<DependentUpon>Web.config</DependentUpon>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
|
||||||
|
<ProjectExtensions>
|
||||||
|
<VisualStudio>
|
||||||
|
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||||
|
<WebProjectProperties>
|
||||||
|
<UseIIS>True</UseIIS>
|
||||||
|
<AutoAssignPort>True</AutoAssignPort>
|
||||||
|
<DevelopmentServerPort>58178</DevelopmentServerPort>
|
||||||
|
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||||
|
<IISUrl>http://localhost:58178/</IISUrl>
|
||||||
|
<NTLMAuthentication>False</NTLMAuthentication>
|
||||||
|
<UseCustomServer>False</UseCustomServer>
|
||||||
|
<CustomServerUrl>
|
||||||
|
</CustomServerUrl>
|
||||||
|
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||||
|
</WebProjectProperties>
|
||||||
|
</FlavorProperties>
|
||||||
|
</VisualStudio>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.1.3.2\build\Microsoft.Net.Compilers.props'))" />
|
||||||
|
<Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
|
||||||
|
</Target>
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
17
src/Web/Catalog.WebForms/Catalog.WebForms/Contact.aspx
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<%@ Page Title="Contact" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Contact.aspx.cs" Inherits="Microsoft.eShopOnContainers.Catalog.WebForms.Contact" %>
|
||||||
|
|
||||||
|
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
|
||||||
|
<h2><%: Title %>.</h2>
|
||||||
|
<h3>Your contact page.</h3>
|
||||||
|
<address>
|
||||||
|
One Microsoft Way<br />
|
||||||
|
Redmond, WA 98052-6399<br />
|
||||||
|
<abbr title="Phone">P:</abbr>
|
||||||
|
425.555.0100
|
||||||
|
</address>
|
||||||
|
|
||||||
|
<address>
|
||||||
|
<strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br />
|
||||||
|
<strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
|
||||||
|
</address>
|
||||||
|
</asp:Content>
|
17
src/Web/Catalog.WebForms/Catalog.WebForms/Contact.aspx.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.UI;
|
||||||
|
using System.Web.UI.WebControls;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public partial class Contact : Page
|
||||||
|
{
|
||||||
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
src/Web/Catalog.WebForms/Catalog.WebForms/Contact.aspx.designer.cs
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms {
|
||||||
|
|
||||||
|
|
||||||
|
public partial class Contact {
|
||||||
|
}
|
||||||
|
}
|
31
src/Web/Catalog.WebForms/Catalog.WebForms/Content/Site.css
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Move down content because we have a fixed navbar that is 50px tall */
|
||||||
|
body {
|
||||||
|
padding-top: 50px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wrapping element */
|
||||||
|
/* Set some basic padding to keep content from hitting the edges */
|
||||||
|
.body-content {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set widths on the form inputs since otherwise they're 100% wide */
|
||||||
|
input,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
max-width: 280px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Responsive: Portrait tablets and up */
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
.jumbotron {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
6816
src/Web/Catalog.WebForms/Catalog.WebForms/Content/bootstrap.css
vendored
Normal file
20
src/Web/Catalog.WebForms/Catalog.WebForms/Content/bootstrap.min.css
vendored
Normal file
After Width: | Height: | Size: 595 KiB |
After Width: | Height: | Size: 560 KiB |
After Width: | Height: | Size: 504 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 498 KiB |
73
src/Web/Catalog.WebForms/Catalog.WebForms/Default.aspx
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Microsoft.eShopOnContainers.Catalog.WebForms._Default" Async="true" %>
|
||||||
|
|
||||||
|
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
|
||||||
|
<div class="row">
|
||||||
|
<asp:ListView ID="catalogList" runat="server"
|
||||||
|
DataKeyNames="Id" GroupItemCount="4"
|
||||||
|
ItemType="eShopOnContainers.Core.Models.Catalog.CatalogItem">
|
||||||
|
<EmptyDataTemplate>
|
||||||
|
<table >
|
||||||
|
<tr>
|
||||||
|
<td>Well, there's nothing in the catalog.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</EmptyDataTemplate>
|
||||||
|
<EmptyItemTemplate>
|
||||||
|
<td/>
|
||||||
|
</EmptyItemTemplate>
|
||||||
|
<GroupTemplate>
|
||||||
|
<tr id="itemPlaceholderContainer" runat="server">
|
||||||
|
<td id="itemPlaceholder" runat="server"></td>
|
||||||
|
</tr>
|
||||||
|
</GroupTemplate>
|
||||||
|
<ItemTemplate>
|
||||||
|
<td runat="server">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="ProductDetails.aspx?productID=<%#:Item.Id%>">
|
||||||
|
<img src="<%#:Item.PictureUri%>"
|
||||||
|
style="border: solid" /></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="ProductDetails.aspx?productID=<%#:Item.Id%>">
|
||||||
|
<span>
|
||||||
|
<%#:Item.Name%>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<br />
|
||||||
|
<span>
|
||||||
|
<b>Price: </b><%#:String.Format("{0:c}", Item.Price)%>
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</ItemTemplate>
|
||||||
|
<LayoutTemplate>
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<table id="groupPlaceholderContainer" runat="server" style="width:100%">
|
||||||
|
<tr id="groupPlaceholder"></tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</LayoutTemplate>
|
||||||
|
</asp:ListView>
|
||||||
|
</div>
|
||||||
|
</asp:Content>
|
45
src/Web/Catalog.WebForms/Catalog.WebForms/Default.aspx.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using Autofac;
|
||||||
|
using Autofac.Core;
|
||||||
|
using eShopOnContainers.Core.Models.Catalog;
|
||||||
|
using eShopOnContainers.Core.Services.Catalog;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.UI;
|
||||||
|
using System.Web.UI.WebControls;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public partial class _Default : Page
|
||||||
|
{
|
||||||
|
private ILifetimeScope scope;
|
||||||
|
|
||||||
|
private ICatalogService catalog;
|
||||||
|
|
||||||
|
protected override void OnLoad(EventArgs e)
|
||||||
|
{
|
||||||
|
RegisterAsyncTask(new PageAsyncTask(LoadCatalogDataAsync));
|
||||||
|
|
||||||
|
base.OnLoad(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoadCatalogDataAsync()
|
||||||
|
{
|
||||||
|
var container = Application.Get("container") as IContainer;
|
||||||
|
using (scope = container?.BeginLifetimeScope())
|
||||||
|
{
|
||||||
|
catalog = container?.Resolve<ICatalogService>();
|
||||||
|
var collection = await catalog?.GetCatalogAsync();
|
||||||
|
catalogList.DataSource = collection;
|
||||||
|
catalogList.DataBind();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
src/Web/Catalog.WebForms/Catalog.WebForms/Default.aspx.designer.cs
generated
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms {
|
||||||
|
|
||||||
|
|
||||||
|
public partial class _Default {
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// catalogList control.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Auto-generated field.
|
||||||
|
/// To modify move field declaration from designer file to code-behind file.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::System.Web.UI.WebControls.ListView catalogList;
|
||||||
|
}
|
||||||
|
}
|
4
src/Web/Catalog.WebForms/Catalog.WebForms/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM microsoft/aspnet
|
||||||
|
ARG source
|
||||||
|
WORKDIR /inetpub/wwwroot
|
||||||
|
COPY ${source:-obj/Docker/publish} .
|
@ -0,0 +1,28 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace eShopOnContainers.Core.Extensions
|
||||||
|
{
|
||||||
|
public static class ObservableExtension
|
||||||
|
{
|
||||||
|
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
|
||||||
|
{
|
||||||
|
ObservableCollection<T> collection = new ObservableCollection<T>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (T item in source)
|
||||||
|
{
|
||||||
|
collection.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
// Really?
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
src/Web/Catalog.WebForms/Catalog.WebForms/Global.asax
Normal file
@ -0,0 +1 @@
|
|||||||
|
<%@ Application Codebehind="Global.asax.cs" Inherits="Microsoft.eShopOnContainers.Catalog.WebForms.Global" Language="C#" %>
|
41
src/Web/Catalog.WebForms/Catalog.WebForms/Global.asax.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using Autofac;
|
||||||
|
using eShopOnContainers.Core.Services.Catalog;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Configuration;
|
||||||
|
using System.Web.Optimization;
|
||||||
|
using System.Web.Routing;
|
||||||
|
using System.Web.Security;
|
||||||
|
using System.Web.SessionState;
|
||||||
|
|
||||||
|
namespace Microsoft.eShopOnContainers.Catalog.WebForms
|
||||||
|
{
|
||||||
|
public class Global : HttpApplication
|
||||||
|
{
|
||||||
|
|
||||||
|
void Application_Start(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Code that runs on application startup
|
||||||
|
RouteConfig.RegisterRoutes(RouteTable.Routes);
|
||||||
|
BundleConfig.RegisterBundles(BundleTable.Bundles);
|
||||||
|
|
||||||
|
// Register Containers:
|
||||||
|
var settings= WebConfigurationManager.AppSettings;
|
||||||
|
var useFake = settings["usefake"];
|
||||||
|
bool fake = useFake == "true";
|
||||||
|
var builder = new ContainerBuilder();
|
||||||
|
if (fake)
|
||||||
|
{
|
||||||
|
builder.RegisterType<CatalogMockService>()
|
||||||
|
.As<ICatalogService>();
|
||||||
|
} else {
|
||||||
|
builder.RegisterType<CatalogMockService>()
|
||||||
|
.As<ICatalogService>();
|
||||||
|
}
|
||||||
|
var container = builder.Build();
|
||||||
|
Application.Add("container", container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
// Taken from https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogBrand.cs
|
||||||
|
// Issue: How to make this DRY and still support the monolithic lift and shift scenario?
|
||||||
|
|
||||||
|
namespace eShopOnContainers.Core.Models.Catalog
|
||||||
|
{
|
||||||
|
public class CatalogBrand
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Brand { get; set; }
|
||||||
|
|
||||||
|
public override string ToString() => Brand;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
// Taken from https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogItem.cs
|
||||||
|
// Issue: How to make this DRY and still support the monolithic lift and shift scenario?
|
||||||
|
namespace eShopOnContainers.Core.Models.Catalog
|
||||||
|
{
|
||||||
|
public class CatalogItem
|
||||||
|
{
|
||||||
|
public string Id { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public decimal Price { get; set; }
|
||||||
|
public string PictureUri { get; set; }
|
||||||
|
public int CatalogBrandId { get; set; }
|
||||||
|
public string CatalogBrand { get; set; }
|
||||||
|
public int CatalogTypeId { get; set; }
|
||||||
|
public string CatalogType { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace eShopOnContainers.Core.Models.Catalog
|
||||||
|
{
|
||||||
|
public class CatalogRoot
|
||||||
|
{
|
||||||
|
public int PageIndex { get; set; }
|
||||||
|
public int PageSize { get; set; }
|
||||||
|
public int Count { get; set; }
|
||||||
|
public List<CatalogItem> Data { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
// Taken from https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Catalog/CatalogType.cs
|
||||||
|
// Issue: How to make this DRY and still support the monolithic lift and shift scenario?
|
||||||
|
namespace eShopOnContainers.Core.Models.Catalog
|
||||||
|
{
|
||||||
|
public class CatalogType
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Type { get; set; }
|
||||||
|
|
||||||
|
public override string ToString() => Type;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("Catalog.WebForms")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("Catalog.WebForms")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("07b42e24-32f8-4c10-99a8-0fb5ac6bfebb")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Revision and Build Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
@ -0,0 +1,34 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js
|
||||||
|
function DetailsView() {
|
||||||
|
this.pageIndex = null;
|
||||||
|
this.dataKeys = null;
|
||||||
|
this.createPropertyString = DetailsView_createPropertyString;
|
||||||
|
this.setStateField = DetailsView_setStateValue;
|
||||||
|
this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;
|
||||||
|
this.stateField = null;
|
||||||
|
this.panelElement = null;
|
||||||
|
this.callback = null;
|
||||||
|
}
|
||||||
|
function DetailsView_createPropertyString() {
|
||||||
|
return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);
|
||||||
|
}
|
||||||
|
function DetailsView_setStateValue() {
|
||||||
|
this.stateField.value = this.createPropertyString();
|
||||||
|
}
|
||||||
|
function DetailsView_OnCallback (result, context) {
|
||||||
|
var value = new String(result);
|
||||||
|
var valsArray = value.split("|");
|
||||||
|
var innerHtml = valsArray[2];
|
||||||
|
for (var i = 3; i < valsArray.length; i++) {
|
||||||
|
innerHtml += "|" + valsArray[i];
|
||||||
|
}
|
||||||
|
context.panelElement.innerHTML = innerHtml;
|
||||||
|
context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);
|
||||||
|
}
|
||||||
|
function DetailsView_getHiddenFieldContents(arg) {
|
||||||
|
return arg + "|" + this.stateField.value;
|
||||||
|
}
|
||||||
|
function createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {
|
||||||
|
var value = new Array(pageIndex, dataKeys);
|
||||||
|
return value.join("|");
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js
|
||||||
|
function WebForm_FindFirstFocusableChild(control) {
|
||||||
|
if (!control || !(control.tagName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tagName = control.tagName.toLowerCase();
|
||||||
|
if (tagName == "undefined") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var children = control.childNodes;
|
||||||
|
if (children) {
|
||||||
|
for (var i = 0; i < children.length; i++) {
|
||||||
|
try {
|
||||||
|
if (WebForm_CanFocus(children[i])) {
|
||||||
|
return children[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var focused = WebForm_FindFirstFocusableChild(children[i]);
|
||||||
|
if (WebForm_CanFocus(focused)) {
|
||||||
|
return focused;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
function WebForm_AutoFocus(focusId) {
|
||||||
|
var targetControl;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
targetControl = document.getElementById(focusId);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
targetControl = document.all[focusId];
|
||||||
|
}
|
||||||
|
var focused = targetControl;
|
||||||
|
if (targetControl && (!WebForm_CanFocus(targetControl)) ) {
|
||||||
|
focused = WebForm_FindFirstFocusableChild(targetControl);
|
||||||
|
}
|
||||||
|
if (focused) {
|
||||||
|
try {
|
||||||
|
focused.focus();
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
focused.scrollIntoView(false);
|
||||||
|
}
|
||||||
|
if (window.__smartNav) {
|
||||||
|
window.__smartNav.ae = focused.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_CanFocus(element) {
|
||||||
|
if (!element || !(element.tagName)) return false;
|
||||||
|
var tagName = element.tagName.toLowerCase();
|
||||||
|
return (!(element.disabled) &&
|
||||||
|
(!(element.type) || element.type.toLowerCase() != "hidden") &&
|
||||||
|
WebForm_IsFocusableTag(tagName) &&
|
||||||
|
WebForm_IsInVisibleContainer(element)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
function WebForm_IsFocusableTag(tagName) {
|
||||||
|
return (tagName == "input" ||
|
||||||
|
tagName == "textarea" ||
|
||||||
|
tagName == "select" ||
|
||||||
|
tagName == "button" ||
|
||||||
|
tagName == "a");
|
||||||
|
}
|
||||||
|
function WebForm_IsInVisibleContainer(ctrl) {
|
||||||
|
var current = ctrl;
|
||||||
|
while((typeof(current) != "undefined") && (current != null)) {
|
||||||
|
if (current.disabled ||
|
||||||
|
( typeof(current.style) != "undefined" &&
|
||||||
|
( ( typeof(current.style.display) != "undefined" &&
|
||||||
|
current.style.display == "none") ||
|
||||||
|
( typeof(current.style.visibility) != "undefined" &&
|
||||||
|
current.style.visibility == "hidden") ) ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (typeof(current.parentNode) != "undefined" &&
|
||||||
|
current.parentNode != null &&
|
||||||
|
current.parentNode != current &&
|
||||||
|
current.parentNode.tagName.toLowerCase() != "body") {
|
||||||
|
current = current.parentNode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js
|
||||||
|
function GridView() {
|
||||||
|
this.pageIndex = null;
|
||||||
|
this.sortExpression = null;
|
||||||
|
this.sortDirection = null;
|
||||||
|
this.dataKeys = null;
|
||||||
|
this.createPropertyString = GridView_createPropertyString;
|
||||||
|
this.setStateField = GridView_setStateValue;
|
||||||
|
this.getHiddenFieldContents = GridView_getHiddenFieldContents;
|
||||||
|
this.stateField = null;
|
||||||
|
this.panelElement = null;
|
||||||
|
this.callback = null;
|
||||||
|
}
|
||||||
|
function GridView_createPropertyString() {
|
||||||
|
return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);
|
||||||
|
}
|
||||||
|
function GridView_setStateValue() {
|
||||||
|
this.stateField.value = this.createPropertyString();
|
||||||
|
}
|
||||||
|
function GridView_OnCallback (result, context) {
|
||||||
|
var value = new String(result);
|
||||||
|
var valsArray = value.split("|");
|
||||||
|
var innerHtml = valsArray[4];
|
||||||
|
for (var i = 5; i < valsArray.length; i++) {
|
||||||
|
innerHtml += "|" + valsArray[i];
|
||||||
|
}
|
||||||
|
context.panelElement.innerHTML = innerHtml;
|
||||||
|
context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);
|
||||||
|
}
|
||||||
|
function GridView_getHiddenFieldContents(arg) {
|
||||||
|
return arg + "|" + this.stateField.value;
|
||||||
|
}
|
||||||
|
function createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {
|
||||||
|
var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);
|
||||||
|
return value.join("|");
|
||||||
|
}
|
6
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/WebForms/MSAjax/MicrosoftAjax.js
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// MicrosoftAjaxTimer.js
|
||||||
|
Type._registerScript("Timer.js",["MicrosoftAjaxComponentModel.js"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,"dispose")},_doPostback:function(){__doPostBack(this.get_uniqueID(),"")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,"initialize");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass("Sys.UI._Timer",Sys.UI.Control);
|
@ -0,0 +1,6 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// MicrosoftAjaxWebServices.js
|
||||||
|
Type._registerScript("MicrosoftAjaxWebServices.js",["MicrosoftAjaxNetwork.js"]);Type.registerNamespace("Sys.Net");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange("value",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext==="undefined"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||"callback"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a==="undefined")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass("Sys.Net.WebServiceProxy");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||"callback";c="_jsonp"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+"/"+encodeURIComponent(a):q,r,n?p+"=Sys."+c:null);if(n){s=document.createElement("script");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!=="undefined"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()["Content-Type"]="application/json; charset=utf-8";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o==="{}")o=""}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader("Content-Type");if(e.startsWith("application/json"))c=d.get_object();else if(e.startsWith("text/xml"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader("jsonerror"),h=k==="true";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith("application/json"))c=!c||typeof c.d==="undefined"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,"",""),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\s*([a-zA-Z0-9\+\-\.]+\:)\/\/([^?#\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||""},get_exceptionType:function(){return this._exceptionType||""},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError");
|
@ -0,0 +1,898 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js
|
||||||
|
var __rootMenuItem;
|
||||||
|
var __menuInterval;
|
||||||
|
var __scrollPanel;
|
||||||
|
var __disappearAfter = 500;
|
||||||
|
function Menu_ClearInterval() {
|
||||||
|
if (__menuInterval) {
|
||||||
|
window.clearInterval(__menuInterval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_Collapse(item) {
|
||||||
|
Menu_SetRoot(item);
|
||||||
|
if (__rootMenuItem) {
|
||||||
|
Menu_ClearInterval();
|
||||||
|
if (__disappearAfter >= 0) {
|
||||||
|
__menuInterval = window.setInterval("Menu_HideItems()", __disappearAfter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {
|
||||||
|
Menu_ClearInterval();
|
||||||
|
var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
|
var horizontal = true;
|
||||||
|
if (!tr.id) {
|
||||||
|
horizontal = false;
|
||||||
|
tr = tr.parentNode;
|
||||||
|
}
|
||||||
|
var child = Menu_FindSubMenu(item);
|
||||||
|
if (child) {
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
child.rel = tr.id;
|
||||||
|
child.x = horizontalOffset;
|
||||||
|
child.y = verticalOffset;
|
||||||
|
if (horizontal) child.pos = "bottom";
|
||||||
|
PopOut_Show(child.id, hideScrollers, data);
|
||||||
|
}
|
||||||
|
Menu_SetRoot(item);
|
||||||
|
if (child) {
|
||||||
|
if (!document.body.__oldOnClick && document.body.onclick) {
|
||||||
|
document.body.__oldOnClick = document.body.onclick;
|
||||||
|
}
|
||||||
|
if (__rootMenuItem) {
|
||||||
|
document.body.onclick = Menu_HideItems;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu_ResetSiblings(tr);
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
function Menu_FindMenu(item) {
|
||||||
|
if (item && item.menu) return item.menu;
|
||||||
|
var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
|
if (!tr.id) {
|
||||||
|
tr = tr.parentNode;
|
||||||
|
}
|
||||||
|
for (var i = tr.id.length - 1; i >= 0; i--) {
|
||||||
|
if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {
|
||||||
|
var menu = WebForm_GetElementById(tr.id.substr(0, i));
|
||||||
|
if (menu) {
|
||||||
|
item.menu = menu;
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
function Menu_FindNext(item) {
|
||||||
|
var a = WebForm_GetElementByTagName(item, "A");
|
||||||
|
var parent = Menu_FindParentContainer(item);
|
||||||
|
var first = null;
|
||||||
|
if (parent) {
|
||||||
|
var links = WebForm_GetElementsByTagName(parent, "A");
|
||||||
|
var match = false;
|
||||||
|
for (var i = 0; i < links.length; i++) {
|
||||||
|
var link = links[i];
|
||||||
|
if (Menu_IsSelectable(link)) {
|
||||||
|
if (Menu_FindParentContainer(link) == parent) {
|
||||||
|
if (match) {
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
else if (!first) {
|
||||||
|
first = link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!match && link == a) {
|
||||||
|
match = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
function Menu_FindParentContainer(item) {
|
||||||
|
if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;
|
||||||
|
var a = (item.tagName.toLowerCase() == "a") ? item : WebForm_GetElementByTagName(item, "A");
|
||||||
|
var menu = Menu_FindMenu(a);
|
||||||
|
if (menu) {
|
||||||
|
var parent = item;
|
||||||
|
while (parent && parent.tagName &&
|
||||||
|
parent.id != menu.id &&
|
||||||
|
parent.tagName.toLowerCase() != "div") {
|
||||||
|
parent = parent.parentNode;
|
||||||
|
}
|
||||||
|
item.menu_ParentContainerCache = parent;
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_FindParentItem(item) {
|
||||||
|
var parentContainer = Menu_FindParentContainer(item);
|
||||||
|
var parentContainerID = parentContainer.id;
|
||||||
|
var len = parentContainerID.length;
|
||||||
|
if (parentContainerID && parentContainerID.substr(len - 5) == "Items") {
|
||||||
|
var parentItemID = parentContainerID.substr(0, len - 5);
|
||||||
|
return WebForm_GetElementById(parentItemID);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
function Menu_FindPrevious(item) {
|
||||||
|
var a = WebForm_GetElementByTagName(item, "A");
|
||||||
|
var parent = Menu_FindParentContainer(item);
|
||||||
|
var last = null;
|
||||||
|
if (parent) {
|
||||||
|
var links = WebForm_GetElementsByTagName(parent, "A");
|
||||||
|
for (var i = 0; i < links.length; i++) {
|
||||||
|
var link = links[i];
|
||||||
|
if (Menu_IsSelectable(link)) {
|
||||||
|
if (link == a && last) {
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
if (Menu_FindParentContainer(link) == parent) {
|
||||||
|
last = link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
function Menu_FindSubMenu(item) {
|
||||||
|
var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
|
if (!tr.id) {
|
||||||
|
tr=tr.parentNode;
|
||||||
|
}
|
||||||
|
return WebForm_GetElementById(tr.id + "Items");
|
||||||
|
}
|
||||||
|
function Menu_Focus(item) {
|
||||||
|
if (item && item.focus) {
|
||||||
|
var pos = WebForm_GetElementPosition(item);
|
||||||
|
var parentContainer = Menu_FindParentContainer(item);
|
||||||
|
if (!parentContainer.offset) {
|
||||||
|
parentContainer.offset = 0;
|
||||||
|
}
|
||||||
|
var posParent = WebForm_GetElementPosition(parentContainer);
|
||||||
|
var delta;
|
||||||
|
if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {
|
||||||
|
delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;
|
||||||
|
PopOut_Scroll(parentContainer, delta);
|
||||||
|
}
|
||||||
|
else if (pos.y < posParent.y + parentContainer.offset) {
|
||||||
|
delta = posParent.y + parentContainer.offset - pos.y;
|
||||||
|
PopOut_Scroll(parentContainer, -delta);
|
||||||
|
}
|
||||||
|
PopOut_HideScrollers(parentContainer);
|
||||||
|
item.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_GetData(item) {
|
||||||
|
if (!item.data) {
|
||||||
|
var a = (item.tagName.toLowerCase() == "a" ? item : WebForm_GetElementByTagName(item, "a"));
|
||||||
|
var menu = Menu_FindMenu(a);
|
||||||
|
try {
|
||||||
|
item.data = eval(menu.id + "_Data");
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
}
|
||||||
|
return item.data;
|
||||||
|
}
|
||||||
|
function Menu_HideItems(items) {
|
||||||
|
if (document.body.__oldOnClick) {
|
||||||
|
document.body.onclick = document.body.__oldOnClick;
|
||||||
|
document.body.__oldOnClick = null;
|
||||||
|
}
|
||||||
|
Menu_ClearInterval();
|
||||||
|
if (!items || ((typeof(items.tagName) == "undefined") && (items instanceof Event))) {
|
||||||
|
items = __rootMenuItem;
|
||||||
|
}
|
||||||
|
var table = items;
|
||||||
|
if ((typeof(table) == "undefined") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != "table")) {
|
||||||
|
table = WebForm_GetElementByTagName(table, "TABLE");
|
||||||
|
}
|
||||||
|
if ((typeof(table) == "undefined") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != "table")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var rows = table.rows ? table.rows : table.firstChild.rows;
|
||||||
|
var isVertical = false;
|
||||||
|
for (var r = 0; r < rows.length; r++) {
|
||||||
|
if (rows[r].id) {
|
||||||
|
isVertical = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var i, child, nextLevel;
|
||||||
|
if (isVertical) {
|
||||||
|
for(i = 0; i < rows.length; i++) {
|
||||||
|
if (rows[i].id) {
|
||||||
|
child = WebForm_GetElementById(rows[i].id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (rows[i].cells[0]) {
|
||||||
|
nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], "TABLE");
|
||||||
|
if (nextLevel) {
|
||||||
|
Menu_HideItems(nextLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (rows[0]) {
|
||||||
|
for(i = 0; i < rows[0].cells.length; i++) {
|
||||||
|
if (rows[0].cells[i].id) {
|
||||||
|
child = WebForm_GetElementById(rows[0].cells[i].id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], "TABLE");
|
||||||
|
if (nextLevel) {
|
||||||
|
Menu_HideItems(rows[0].cells[i].firstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (items && items.id) {
|
||||||
|
PopOut_Hide(items.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_HoverDisabled(item) {
|
||||||
|
var node = (item.tagName.toLowerCase() == "td") ?
|
||||||
|
item:
|
||||||
|
item.cells[0];
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) return;
|
||||||
|
node = WebForm_GetElementByTagName(node, "table").rows[0].cells[0].childNodes[0];
|
||||||
|
if (data.disappearAfter >= 200) {
|
||||||
|
__disappearAfter = data.disappearAfter;
|
||||||
|
}
|
||||||
|
Menu_Expand(node, data.horizontalOffset, data.verticalOffset);
|
||||||
|
}
|
||||||
|
function Menu_HoverDynamic(item) {
|
||||||
|
var node = (item.tagName.toLowerCase() == "td") ?
|
||||||
|
item:
|
||||||
|
item.cells[0];
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) return;
|
||||||
|
var nodeTable = WebForm_GetElementByTagName(node, "table");
|
||||||
|
if (data.hoverClass) {
|
||||||
|
nodeTable.hoverClass = data.hoverClass;
|
||||||
|
WebForm_AppendToClassName(nodeTable, data.hoverClass);
|
||||||
|
}
|
||||||
|
node = nodeTable.rows[0].cells[0].childNodes[0];
|
||||||
|
if (data.hoverHyperLinkClass) {
|
||||||
|
node.hoverHyperLinkClass = data.hoverHyperLinkClass;
|
||||||
|
WebForm_AppendToClassName(node, data.hoverHyperLinkClass);
|
||||||
|
}
|
||||||
|
if (data.disappearAfter >= 200) {
|
||||||
|
__disappearAfter = data.disappearAfter;
|
||||||
|
}
|
||||||
|
Menu_Expand(node, data.horizontalOffset, data.verticalOffset);
|
||||||
|
}
|
||||||
|
function Menu_HoverRoot(item) {
|
||||||
|
var node = (item.tagName.toLowerCase() == "td") ?
|
||||||
|
item:
|
||||||
|
item.cells[0];
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var nodeTable = WebForm_GetElementByTagName(node, "table");
|
||||||
|
if (data.staticHoverClass) {
|
||||||
|
nodeTable.hoverClass = data.staticHoverClass;
|
||||||
|
WebForm_AppendToClassName(nodeTable, data.staticHoverClass);
|
||||||
|
}
|
||||||
|
node = nodeTable.rows[0].cells[0].childNodes[0];
|
||||||
|
if (data.staticHoverHyperLinkClass) {
|
||||||
|
node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;
|
||||||
|
WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
function Menu_HoverStatic(item) {
|
||||||
|
var node = Menu_HoverRoot(item);
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) return;
|
||||||
|
__disappearAfter = data.disappearAfter;
|
||||||
|
Menu_Expand(node, data.horizontalOffset, data.verticalOffset);
|
||||||
|
}
|
||||||
|
function Menu_IsHorizontal(item) {
|
||||||
|
if (item) {
|
||||||
|
var a = ((item.tagName && (item.tagName.toLowerCase == "a")) ? item : WebForm_GetElementByTagName(item, "A"));
|
||||||
|
if (!a) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
|
if (td.id) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function Menu_IsSelectable(link) {
|
||||||
|
return (link && link.href)
|
||||||
|
}
|
||||||
|
function Menu_Key(item) {
|
||||||
|
var event;
|
||||||
|
if (item.currentTarget) {
|
||||||
|
event = item;
|
||||||
|
item = event.currentTarget;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
event = window.event;
|
||||||
|
}
|
||||||
|
var key = (event ? event.keyCode : -1);
|
||||||
|
var data = Menu_GetData(item);
|
||||||
|
if (!data) return;
|
||||||
|
var horizontal = Menu_IsHorizontal(item);
|
||||||
|
var a = WebForm_GetElementByTagName(item, "A");
|
||||||
|
var nextItem, parentItem, previousItem;
|
||||||
|
if ((!horizontal && key == 38) || (horizontal && key == 37)) {
|
||||||
|
previousItem = Menu_FindPrevious(item);
|
||||||
|
while (previousItem && previousItem.disabled) {
|
||||||
|
previousItem = Menu_FindPrevious(previousItem);
|
||||||
|
}
|
||||||
|
if (previousItem) {
|
||||||
|
Menu_Focus(previousItem);
|
||||||
|
Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((!horizontal && key == 40) || (horizontal && key == 39)) {
|
||||||
|
if (horizontal) {
|
||||||
|
var subMenu = Menu_FindSubMenu(a);
|
||||||
|
if (subMenu && subMenu.style && subMenu.style.visibility &&
|
||||||
|
subMenu.style.visibility.toLowerCase() == "hidden") {
|
||||||
|
Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextItem = Menu_FindNext(item);
|
||||||
|
while (nextItem && nextItem.disabled) {
|
||||||
|
nextItem = Menu_FindNext(nextItem);
|
||||||
|
}
|
||||||
|
if (nextItem) {
|
||||||
|
Menu_Focus(nextItem);
|
||||||
|
Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((!horizontal && key == 39) || (horizontal && key == 40)) {
|
||||||
|
var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
if (children) {
|
||||||
|
var firstChild;
|
||||||
|
children = WebForm_GetElementsByTagName(children, "A");
|
||||||
|
for (var i = 0; i < children.length; i++) {
|
||||||
|
if (!children[i].disabled && Menu_IsSelectable(children[i])) {
|
||||||
|
firstChild = children[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (firstChild) {
|
||||||
|
Menu_Focus(firstChild);
|
||||||
|
Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
parentItem = Menu_FindParentItem(item);
|
||||||
|
while (parentItem && !Menu_IsHorizontal(parentItem)) {
|
||||||
|
parentItem = Menu_FindParentItem(parentItem);
|
||||||
|
}
|
||||||
|
if (parentItem) {
|
||||||
|
nextItem = Menu_FindNext(parentItem);
|
||||||
|
while (nextItem && nextItem.disabled) {
|
||||||
|
nextItem = Menu_FindNext(nextItem);
|
||||||
|
}
|
||||||
|
if (nextItem) {
|
||||||
|
Menu_Focus(nextItem);
|
||||||
|
Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((!horizontal && key == 37) || (horizontal && key == 38)) {
|
||||||
|
parentItem = Menu_FindParentItem(item);
|
||||||
|
if (parentItem) {
|
||||||
|
if (Menu_IsHorizontal(parentItem)) {
|
||||||
|
previousItem = Menu_FindPrevious(parentItem);
|
||||||
|
while (previousItem && previousItem.disabled) {
|
||||||
|
previousItem = Menu_FindPrevious(previousItem);
|
||||||
|
}
|
||||||
|
if (previousItem) {
|
||||||
|
Menu_Focus(previousItem);
|
||||||
|
Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var parentA = WebForm_GetElementByTagName(parentItem, "A");
|
||||||
|
if (parentA) {
|
||||||
|
Menu_Focus(parentA);
|
||||||
|
}
|
||||||
|
Menu_ResetSiblings(parentItem);
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (key == 27) {
|
||||||
|
Menu_HideItems();
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_ResetSiblings(item) {
|
||||||
|
var table = (item.tagName.toLowerCase() == "td") ?
|
||||||
|
item.parentNode.parentNode.parentNode :
|
||||||
|
item.parentNode.parentNode;
|
||||||
|
var isVertical = false;
|
||||||
|
for (var r = 0; r < table.rows.length; r++) {
|
||||||
|
if (table.rows[r].id) {
|
||||||
|
isVertical = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var i, child, childNode;
|
||||||
|
if (isVertical) {
|
||||||
|
for(i = 0; i < table.rows.length; i++) {
|
||||||
|
childNode = table.rows[i];
|
||||||
|
if (childNode != item) {
|
||||||
|
child = WebForm_GetElementById(childNode.id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(i = 0; i < table.rows[0].cells.length; i++) {
|
||||||
|
childNode = table.rows[0].cells[i];
|
||||||
|
if (childNode != item) {
|
||||||
|
child = WebForm_GetElementById(childNode.id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu_ResetTopMenus(table, table, 0, true);
|
||||||
|
}
|
||||||
|
function Menu_ResetTopMenus(table, doNotReset, level, up) {
|
||||||
|
var i, child, childNode;
|
||||||
|
if (up && table.id == "") {
|
||||||
|
var parentTable = table.parentNode.parentNode.parentNode.parentNode;
|
||||||
|
if (parentTable.tagName.toLowerCase() == "table") {
|
||||||
|
Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (level == 0 && table != doNotReset) {
|
||||||
|
if (table.rows[0].id) {
|
||||||
|
for(i = 0; i < table.rows.length; i++) {
|
||||||
|
childNode = table.rows[i];
|
||||||
|
child = WebForm_GetElementById(childNode.id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(i = 0; i < table.rows[0].cells.length; i++) {
|
||||||
|
childNode = table.rows[0].cells[i];
|
||||||
|
child = WebForm_GetElementById(childNode.id + "Items");
|
||||||
|
if (child) {
|
||||||
|
Menu_HideItems(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (level > 0) {
|
||||||
|
for (i = 0; i < table.rows.length; i++) {
|
||||||
|
for (var j = 0; j < table.rows[i].cells.length; j++) {
|
||||||
|
var subTable = table.rows[i].cells[j].firstChild;
|
||||||
|
if (subTable && subTable.tagName.toLowerCase() == "table") {
|
||||||
|
Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_RestoreInterval() {
|
||||||
|
if (__menuInterval && __rootMenuItem) {
|
||||||
|
Menu_ClearInterval();
|
||||||
|
__menuInterval = window.setInterval("Menu_HideItems()", __disappearAfter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_SetRoot(item) {
|
||||||
|
var newRoot = Menu_FindMenu(item);
|
||||||
|
if (newRoot) {
|
||||||
|
if (__rootMenuItem && __rootMenuItem != newRoot) {
|
||||||
|
Menu_HideItems();
|
||||||
|
}
|
||||||
|
__rootMenuItem = newRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Menu_Unhover(item) {
|
||||||
|
var node = (item.tagName.toLowerCase() == "td") ?
|
||||||
|
item:
|
||||||
|
item.cells[0];
|
||||||
|
var nodeTable = WebForm_GetElementByTagName(node, "table");
|
||||||
|
if (nodeTable.hoverClass) {
|
||||||
|
WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);
|
||||||
|
}
|
||||||
|
node = nodeTable.rows[0].cells[0].childNodes[0];
|
||||||
|
if (node.hoverHyperLinkClass) {
|
||||||
|
WebForm_RemoveClassName(node, node.hoverHyperLinkClass);
|
||||||
|
}
|
||||||
|
Menu_Collapse(node);
|
||||||
|
}
|
||||||
|
function PopOut_Clip(element, y, height) {
|
||||||
|
if (element && element.style) {
|
||||||
|
element.style.clip = "rect(" + y + "px auto " + (y + height) + "px auto)";
|
||||||
|
element.style.overflow = "hidden";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Down(scroller) {
|
||||||
|
Menu_ClearInterval();
|
||||||
|
var panel;
|
||||||
|
if (scroller) {
|
||||||
|
panel = scroller.parentNode
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panel = __scrollPanel;
|
||||||
|
}
|
||||||
|
if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {
|
||||||
|
PopOut_Scroll(panel, 2)
|
||||||
|
__scrollPanel = panel;
|
||||||
|
PopOut_ShowScrollers(panel);
|
||||||
|
PopOut_Stop();
|
||||||
|
__scrollPanel.interval = window.setInterval("PopOut_Down()", 8);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PopOut_ShowScrollers(panel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Hide(panelId) {
|
||||||
|
var panel = WebForm_GetElementById(panelId);
|
||||||
|
if (panel && panel.tagName.toLowerCase() == "div") {
|
||||||
|
panel.style.visibility = "hidden";
|
||||||
|
panel.style.display = "none";
|
||||||
|
panel.offset = 0;
|
||||||
|
panel.scrollTop = 0;
|
||||||
|
var table = WebForm_GetElementByTagName(panel, "TABLE");
|
||||||
|
if (table) {
|
||||||
|
WebForm_SetElementY(table, 0);
|
||||||
|
}
|
||||||
|
if (window.navigator && window.navigator.appName == "Microsoft Internet Explorer" &&
|
||||||
|
!window.opera) {
|
||||||
|
var childFrameId = panel.id + "_MenuIFrame";
|
||||||
|
var childFrame = WebForm_GetElementById(childFrameId);
|
||||||
|
if (childFrame) {
|
||||||
|
childFrame.style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_HideScrollers(panel) {
|
||||||
|
if (panel && panel.style) {
|
||||||
|
var up = WebForm_GetElementById(panel.id + "Up");
|
||||||
|
var dn = WebForm_GetElementById(panel.id + "Dn");
|
||||||
|
if (up) {
|
||||||
|
up.style.visibility = "hidden";
|
||||||
|
up.style.display = "none";
|
||||||
|
}
|
||||||
|
if (dn) {
|
||||||
|
dn.style.visibility = "hidden";
|
||||||
|
dn.style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Position(panel, hideScrollers) {
|
||||||
|
if (window.opera) {
|
||||||
|
panel.parentNode.removeChild(panel);
|
||||||
|
document.forms[0].appendChild(panel);
|
||||||
|
}
|
||||||
|
var rel = WebForm_GetElementById(panel.rel);
|
||||||
|
var relTable = WebForm_GetElementByTagName(rel, "TABLE");
|
||||||
|
var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);
|
||||||
|
var panelCoordinates = WebForm_GetElementPosition(panel);
|
||||||
|
var panelHeight = ((typeof(panel.physicalHeight) != "undefined") && (panel.physicalHeight != null)) ?
|
||||||
|
panel.physicalHeight :
|
||||||
|
panelCoordinates.height;
|
||||||
|
panel.physicalHeight = panelHeight;
|
||||||
|
var panelParentCoordinates;
|
||||||
|
if (panel.offsetParent) {
|
||||||
|
panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panelParentCoordinates = new Object();
|
||||||
|
panelParentCoordinates.x = 0;
|
||||||
|
panelParentCoordinates.y = 0;
|
||||||
|
}
|
||||||
|
var overflowElement = WebForm_GetElementById("__overFlowElement");
|
||||||
|
if (!overflowElement) {
|
||||||
|
overflowElement = document.createElement("img");
|
||||||
|
overflowElement.id="__overFlowElement";
|
||||||
|
WebForm_SetElementWidth(overflowElement, 1);
|
||||||
|
document.body.appendChild(overflowElement);
|
||||||
|
}
|
||||||
|
WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));
|
||||||
|
overflowElement.style.visibility = "visible";
|
||||||
|
overflowElement.style.display = "inline";
|
||||||
|
var clientHeight = 0;
|
||||||
|
var clientWidth = 0;
|
||||||
|
if (window.innerHeight) {
|
||||||
|
clientHeight = window.innerHeight;
|
||||||
|
clientWidth = window.innerWidth;
|
||||||
|
}
|
||||||
|
else if (document.documentElement && document.documentElement.clientHeight) {
|
||||||
|
clientHeight = document.documentElement.clientHeight;
|
||||||
|
clientWidth = document.documentElement.clientWidth;
|
||||||
|
}
|
||||||
|
else if (document.body && document.body.clientHeight) {
|
||||||
|
clientHeight = document.body.clientHeight;
|
||||||
|
clientWidth = document.body.clientWidth;
|
||||||
|
}
|
||||||
|
var scrollTop = 0;
|
||||||
|
var scrollLeft = 0;
|
||||||
|
if (typeof(window.pageYOffset) != "undefined") {
|
||||||
|
scrollTop = window.pageYOffset;
|
||||||
|
scrollLeft = window.pageXOffset;
|
||||||
|
}
|
||||||
|
else if (document.documentElement && (typeof(document.documentElement.scrollTop) != "undefined")) {
|
||||||
|
scrollTop = document.documentElement.scrollTop;
|
||||||
|
scrollLeft = document.documentElement.scrollLeft;
|
||||||
|
}
|
||||||
|
else if (document.body && (typeof(document.body.scrollTop) != "undefined")) {
|
||||||
|
scrollTop = document.body.scrollTop;
|
||||||
|
scrollLeft = document.body.scrollLeft;
|
||||||
|
}
|
||||||
|
overflowElement.style.visibility = "hidden";
|
||||||
|
overflowElement.style.display = "none";
|
||||||
|
var bottomWindowBorder = clientHeight + scrollTop;
|
||||||
|
var rightWindowBorder = clientWidth + scrollLeft;
|
||||||
|
var position = panel.pos;
|
||||||
|
if ((typeof(position) == "undefined") || (position == null) || (position == "")) {
|
||||||
|
position = (WebForm_GetElementDir(rel) == "rtl" ? "middleleft" : "middleright");
|
||||||
|
}
|
||||||
|
position = position.toLowerCase();
|
||||||
|
var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;
|
||||||
|
var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode
|
||||||
|
&& rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == "div") ?
|
||||||
|
rel.parentNode.parentNode.parentNode : null;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
PopOut_SetPanelHeight(panel, panelHeight, true);
|
||||||
|
var clip = false;
|
||||||
|
var overflow;
|
||||||
|
if (position.indexOf("top") != -1) {
|
||||||
|
y -= panelHeight;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
if (y < -panelParentCoordinates.y) {
|
||||||
|
y = -panelParentCoordinates.y;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
if (panelHeight > clientHeight - 2) {
|
||||||
|
clip = true;
|
||||||
|
PopOut_SetPanelHeight(panel, clientHeight - 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (position.indexOf("bottom") != -1) {
|
||||||
|
y += relCoordinates.height;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
}
|
||||||
|
overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;
|
||||||
|
if (overflow > 0) {
|
||||||
|
y -= overflow;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
if (y < -panelParentCoordinates.y) {
|
||||||
|
y = 2 - panelParentCoordinates.y + scrollTop;
|
||||||
|
WebForm_SetElementY(panel, y);
|
||||||
|
clip = true;
|
||||||
|
PopOut_SetPanelHeight(panel, clientHeight - 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!clip) {
|
||||||
|
PopOut_SetPanelHeight(panel, panel.clippedHeight, true);
|
||||||
|
}
|
||||||
|
var panelParentOffsetY = 0;
|
||||||
|
if (panel.offsetParent) {
|
||||||
|
panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;
|
||||||
|
}
|
||||||
|
var panelY = ((typeof(panel.originY) != "undefined") && (panel.originY != null)) ?
|
||||||
|
panel.originY :
|
||||||
|
y - panelParentOffsetY;
|
||||||
|
panel.originY = panelY;
|
||||||
|
if (!hideScrollers) {
|
||||||
|
PopOut_ShowScrollers(panel);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PopOut_HideScrollers(panel);
|
||||||
|
}
|
||||||
|
var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;
|
||||||
|
if (borderParent && borderParent.clientLeft) {
|
||||||
|
x += 2 * borderParent.clientLeft;
|
||||||
|
}
|
||||||
|
WebForm_SetElementX(panel, x);
|
||||||
|
if (position.indexOf("left") != -1) {
|
||||||
|
x -= panelCoordinates.width;
|
||||||
|
WebForm_SetElementX(panel, x);
|
||||||
|
if (x < -panelParentCoordinates.x) {
|
||||||
|
WebForm_SetElementX(panel, -panelParentCoordinates.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (position.indexOf("right") != -1) {
|
||||||
|
x += relCoordinates.width;
|
||||||
|
WebForm_SetElementX(panel, x);
|
||||||
|
}
|
||||||
|
overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;
|
||||||
|
if (overflow > 0) {
|
||||||
|
if (position.indexOf("bottom") == -1 && relCoordinates.x > panelCoordinates.width) {
|
||||||
|
x -= relCoordinates.width + panelCoordinates.width;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x -= overflow;
|
||||||
|
}
|
||||||
|
WebForm_SetElementX(panel, x);
|
||||||
|
if (x < -panelParentCoordinates.x) {
|
||||||
|
WebForm_SetElementX(panel, -panelParentCoordinates.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Scroll(panel, offsetDelta) {
|
||||||
|
var table = WebForm_GetElementByTagName(panel, "TABLE");
|
||||||
|
if (!table) return;
|
||||||
|
table.style.position = "relative";
|
||||||
|
var tableY = (table.style.top ? parseInt(table.style.top) : 0);
|
||||||
|
panel.offset += offsetDelta;
|
||||||
|
WebForm_SetElementY(table, tableY - offsetDelta);
|
||||||
|
}
|
||||||
|
function PopOut_SetPanelHeight(element, height, doNotClip) {
|
||||||
|
if (element && element.style) {
|
||||||
|
var size = WebForm_GetElementPosition(element);
|
||||||
|
element.physicalWidth = size.width;
|
||||||
|
element.clippedHeight = height;
|
||||||
|
WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));
|
||||||
|
if (doNotClip && element.style) {
|
||||||
|
element.style.clip = "rect(auto auto auto auto)";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PopOut_Clip(element, 0, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Show(panelId, hideScrollers, data) {
|
||||||
|
var panel = WebForm_GetElementById(panelId);
|
||||||
|
if (panel && panel.tagName.toLowerCase() == "div") {
|
||||||
|
panel.style.visibility = "visible";
|
||||||
|
panel.style.display = "inline";
|
||||||
|
if (!panel.offset || hideScrollers) {
|
||||||
|
panel.scrollTop = 0;
|
||||||
|
panel.offset = 0;
|
||||||
|
var table = WebForm_GetElementByTagName(panel, "TABLE");
|
||||||
|
if (table) {
|
||||||
|
WebForm_SetElementY(table, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PopOut_Position(panel, hideScrollers);
|
||||||
|
var z = 1;
|
||||||
|
var isIE = window.navigator && window.navigator.appName == "Microsoft Internet Explorer" && !window.opera;
|
||||||
|
if (isIE && data) {
|
||||||
|
var childFrameId = panel.id + "_MenuIFrame";
|
||||||
|
var childFrame = WebForm_GetElementById(childFrameId);
|
||||||
|
var parent = panel.offsetParent;
|
||||||
|
if (!childFrame) {
|
||||||
|
childFrame = document.createElement("iframe");
|
||||||
|
childFrame.id = childFrameId;
|
||||||
|
childFrame.src = (data.iframeUrl ? data.iframeUrl : "about:blank");
|
||||||
|
childFrame.style.position = "absolute";
|
||||||
|
childFrame.style.display = "none";
|
||||||
|
childFrame.scrolling = "no";
|
||||||
|
childFrame.frameBorder = "0";
|
||||||
|
if (parent.tagName.toLowerCase() == "html") {
|
||||||
|
document.body.appendChild(childFrame);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
parent.appendChild(childFrame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var pos = WebForm_GetElementPosition(panel);
|
||||||
|
var parentPos = WebForm_GetElementPosition(parent);
|
||||||
|
WebForm_SetElementX(childFrame, pos.x - parentPos.x);
|
||||||
|
WebForm_SetElementY(childFrame, pos.y - parentPos.y);
|
||||||
|
WebForm_SetElementWidth(childFrame, pos.width);
|
||||||
|
WebForm_SetElementHeight(childFrame, pos.height);
|
||||||
|
childFrame.style.display = "block";
|
||||||
|
if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != "auto") {
|
||||||
|
z = panel.currentStyle.zIndex;
|
||||||
|
}
|
||||||
|
else if (panel.style.zIndex) {
|
||||||
|
z = panel.style.zIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panel.style.zIndex = z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_ShowScrollers(panel) {
|
||||||
|
if (panel && panel.style) {
|
||||||
|
var up = WebForm_GetElementById(panel.id + "Up");
|
||||||
|
var dn = WebForm_GetElementById(panel.id + "Dn");
|
||||||
|
var cnt = 0;
|
||||||
|
if (up && dn) {
|
||||||
|
if (panel.offset && panel.offset > 0) {
|
||||||
|
up.style.visibility = "visible";
|
||||||
|
up.style.display = "inline";
|
||||||
|
cnt++;
|
||||||
|
if (panel.clientWidth) {
|
||||||
|
WebForm_SetElementWidth(up, panel.clientWidth
|
||||||
|
- (up.clientLeft ? (2 * up.clientLeft) : 0));
|
||||||
|
}
|
||||||
|
WebForm_SetElementY(up, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
up.style.visibility = "hidden";
|
||||||
|
up.style.display = "none";
|
||||||
|
}
|
||||||
|
if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {
|
||||||
|
dn.style.visibility = "visible";
|
||||||
|
dn.style.display = "inline";
|
||||||
|
cnt++;
|
||||||
|
if (panel.clientWidth) {
|
||||||
|
WebForm_SetElementWidth(dn, panel.clientWidth
|
||||||
|
- (dn.clientLeft ? (2 * dn.clientLeft) : 0));
|
||||||
|
}
|
||||||
|
WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height
|
||||||
|
- (panel.clientTop ? (2 * panel.clientTop) : 0));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dn.style.visibility = "hidden";
|
||||||
|
dn.style.display = "none";
|
||||||
|
}
|
||||||
|
if (cnt == 0) {
|
||||||
|
panel.style.clip = "rect(auto auto auto auto)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function PopOut_Stop() {
|
||||||
|
if (__scrollPanel && __scrollPanel.interval) {
|
||||||
|
window.clearInterval(__scrollPanel.interval);
|
||||||
|
}
|
||||||
|
Menu_RestoreInterval();
|
||||||
|
}
|
||||||
|
function PopOut_Up(scroller) {
|
||||||
|
Menu_ClearInterval();
|
||||||
|
var panel;
|
||||||
|
if (scroller) {
|
||||||
|
panel = scroller.parentNode
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panel = __scrollPanel;
|
||||||
|
}
|
||||||
|
if (panel && panel.offset && panel.offset > 0) {
|
||||||
|
PopOut_Scroll(panel, -2);
|
||||||
|
__scrollPanel = panel;
|
||||||
|
PopOut_ShowScrollers(panel);
|
||||||
|
PopOut_Stop();
|
||||||
|
__scrollPanel.interval = window.setInterval("PopOut_Up()", 8);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,697 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js
|
||||||
|
if (!window.Sys) { window.Sys = {}; }
|
||||||
|
if (!Sys.WebForms) { Sys.WebForms = {}; }
|
||||||
|
Sys.WebForms.Menu = function(options) {
|
||||||
|
this.items = [];
|
||||||
|
this.depth = options.depth || 1;
|
||||||
|
this.parentMenuItem = options.parentMenuItem;
|
||||||
|
this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);
|
||||||
|
if (this.element.tagName === 'DIV') {
|
||||||
|
var containerElement = this.element;
|
||||||
|
this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);
|
||||||
|
this.element.tabIndex = options.tabIndex || 0;
|
||||||
|
options.element = containerElement;
|
||||||
|
options.menu = this;
|
||||||
|
this.container = new Sys.WebForms._MenuContainer(options);
|
||||||
|
Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.container = options.container;
|
||||||
|
this.keyMap = options.keyMap;
|
||||||
|
}
|
||||||
|
Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);
|
||||||
|
if (this.parentMenuItem && this.parentMenuItem.parentMenu) {
|
||||||
|
this.parentMenu = this.parentMenuItem.parentMenu;
|
||||||
|
this.rootMenu = this.parentMenu.rootMenu;
|
||||||
|
if (!this.element.id) {
|
||||||
|
this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;
|
||||||
|
}
|
||||||
|
if (this.depth > this.container.staticDisplayLevels) {
|
||||||
|
this.displayMode = "dynamic";
|
||||||
|
this.element.style.display = "none";
|
||||||
|
this.element.style.position = "absolute";
|
||||||
|
if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {
|
||||||
|
this.element.style.top = "100%";
|
||||||
|
if (this.container.rightToLeft) {
|
||||||
|
this.element.style.right = "0px";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.element.style.left = "0px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.element.style.top = "0px";
|
||||||
|
if (this.container.rightToLeft) {
|
||||||
|
this.element.style.right = "100%";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.element.style.left = "100%";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.container.rightToLeft) {
|
||||||
|
this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.displayMode = "static";
|
||||||
|
this.element.style.display = "block";
|
||||||
|
if (this.container.orientation === 'horizontal') {
|
||||||
|
Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);
|
||||||
|
var children = this.element.childNodes;
|
||||||
|
var count = children.length;
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
var node = children[i];
|
||||||
|
if (node.nodeType !== 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var topLevelMenuItem = null;
|
||||||
|
if (this.parentMenuItem) {
|
||||||
|
topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;
|
||||||
|
}
|
||||||
|
var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);
|
||||||
|
var previousMenuItem = this.items[this.items.length - 1];
|
||||||
|
if (previousMenuItem) {
|
||||||
|
menuItem.previousSibling = previousMenuItem;
|
||||||
|
previousMenuItem.nextSibling = menuItem;
|
||||||
|
}
|
||||||
|
this.items[this.items.length] = menuItem;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms.Menu.prototype = {
|
||||||
|
blur: function() { if (this.container) this.container.blur(); },
|
||||||
|
collapse: function() {
|
||||||
|
this.each(function(menuItem) {
|
||||||
|
menuItem.hover(false);
|
||||||
|
menuItem.blur();
|
||||||
|
var childMenu = menuItem.childMenu;
|
||||||
|
if (childMenu) {
|
||||||
|
childMenu.collapse();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.hide();
|
||||||
|
},
|
||||||
|
doDispose: function() { this.each(function(item) { item.doDispose(); }); },
|
||||||
|
each: function(fn) {
|
||||||
|
var count = this.items.length;
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
fn(this.items[i]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
firstChild: function() { return this.items[0]; },
|
||||||
|
focus: function() { if (this.container) this.container.focus(); },
|
||||||
|
get_displayed: function() { return this.element.style.display !== 'none'; },
|
||||||
|
get_focused: function() {
|
||||||
|
if (this.container) {
|
||||||
|
return this.container.focused;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
handleKeyPress: function(keyCode) {
|
||||||
|
if (this.keyMap.contains(keyCode)) {
|
||||||
|
if (this.container.focusedMenuItem) {
|
||||||
|
this.container.focusedMenuItem.navigate(keyCode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var firstChild = this.firstChild();
|
||||||
|
if (firstChild) {
|
||||||
|
this.container.navigateTo(firstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
if (!this.get_displayed()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.each(function(item) {
|
||||||
|
if (item.childMenu) {
|
||||||
|
item.childMenu.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!this.isRoot()) {
|
||||||
|
if (this.get_focused()) {
|
||||||
|
this.container.navigateTo(this.parentMenuItem);
|
||||||
|
}
|
||||||
|
this.element.style.display = 'none';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isRoot: function() { return this.rootMenu === this; },
|
||||||
|
isStatic: function() { return this.displayMode === 'static'; },
|
||||||
|
lastChild: function() { return this.items[this.items.length - 1]; },
|
||||||
|
show: function() { this.element.style.display = 'block'; }
|
||||||
|
};
|
||||||
|
if (Sys.WebForms.Menu.registerClass) {
|
||||||
|
Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');
|
||||||
|
}
|
||||||
|
Sys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {
|
||||||
|
this.keyMap = parentMenu.keyMap;
|
||||||
|
this.parentMenu = parentMenu;
|
||||||
|
this.container = parentMenu.container;
|
||||||
|
this.element = listElement;
|
||||||
|
this.topLevelMenuItem = topLevelMenuItem || this;
|
||||||
|
this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);
|
||||||
|
while (this._anchor && this._anchor.tagName !== 'A') {
|
||||||
|
this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);
|
||||||
|
}
|
||||||
|
if (this._anchor) {
|
||||||
|
this._anchor.tabIndex = -1;
|
||||||
|
var subMenu = this._anchor;
|
||||||
|
while (subMenu && subMenu.tagName !== 'UL') {
|
||||||
|
subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);
|
||||||
|
}
|
||||||
|
if (subMenu) {
|
||||||
|
this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });
|
||||||
|
if (!this.childMenu.isStatic()) {
|
||||||
|
Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');
|
||||||
|
Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);
|
||||||
|
Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');
|
||||||
|
Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);
|
||||||
|
if (this._anchor) {
|
||||||
|
Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);
|
||||||
|
}
|
||||||
|
this.element.style.position = "relative";
|
||||||
|
if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {
|
||||||
|
Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left");
|
||||||
|
}
|
||||||
|
if (!this.container.disabled) {
|
||||||
|
Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);
|
||||||
|
Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms.MenuItem.prototype = {
|
||||||
|
applyUp: function(fn, condition) {
|
||||||
|
condition = condition || function(menuItem) { return menuItem; };
|
||||||
|
var menuItem = this;
|
||||||
|
var lastMenuItem = null;
|
||||||
|
while (condition(menuItem)) {
|
||||||
|
fn(menuItem);
|
||||||
|
lastMenuItem = menuItem;
|
||||||
|
menuItem = menuItem.parentMenu.parentMenuItem;
|
||||||
|
}
|
||||||
|
return lastMenuItem;
|
||||||
|
},
|
||||||
|
blur: function() { this.setTabIndex(-1); },
|
||||||
|
doDispose: function() {
|
||||||
|
Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);
|
||||||
|
Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);
|
||||||
|
if (this.childMenu) {
|
||||||
|
this.childMenu.doDispose();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
focus: function() {
|
||||||
|
if (!this.parentMenu.get_displayed()) {
|
||||||
|
this.parentMenu.show();
|
||||||
|
}
|
||||||
|
this.setTabIndex(0);
|
||||||
|
this.container.focused = true;
|
||||||
|
this._anchor.focus();
|
||||||
|
},
|
||||||
|
get_highlighted: function() { return /(^|\s)highlighted(\s|$)/.test(this._anchor.className); },
|
||||||
|
getTabIndex: function() { return this._anchor.tabIndex; },
|
||||||
|
highlight: function(highlighting) {
|
||||||
|
if (highlighting) {
|
||||||
|
this.applyUp(function(menuItem) {
|
||||||
|
menuItem.parentMenu.parentMenuItem.highlight(true);
|
||||||
|
},
|
||||||
|
function(menuItem) {
|
||||||
|
return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');
|
||||||
|
this.setTabIndex(-1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hover: function(hovering) {
|
||||||
|
if (hovering) {
|
||||||
|
var currentHoveredItem = this.container.hoveredMenuItem;
|
||||||
|
if (currentHoveredItem) {
|
||||||
|
currentHoveredItem.hover(false);
|
||||||
|
}
|
||||||
|
var currentFocusedItem = this.container.focusedMenuItem;
|
||||||
|
if (currentFocusedItem && currentFocusedItem !== this) {
|
||||||
|
currentFocusedItem.hover(false);
|
||||||
|
}
|
||||||
|
this.applyUp(function(menuItem) {
|
||||||
|
if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {
|
||||||
|
menuItem.childMenu.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.container.hoveredMenuItem = this;
|
||||||
|
this.highlight(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var menuItem = this;
|
||||||
|
while (menuItem) {
|
||||||
|
menuItem.highlight(false);
|
||||||
|
if (menuItem.childMenu) {
|
||||||
|
if (!menuItem.childMenu.isStatic()) {
|
||||||
|
menuItem.childMenu.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
menuItem = menuItem.parentMenu.parentMenuItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },
|
||||||
|
mouseout: function() {
|
||||||
|
var menuItem = this,
|
||||||
|
id = this.container.pendingMouseoutId,
|
||||||
|
disappearAfter = this.container.disappearAfter;
|
||||||
|
if (id) {
|
||||||
|
window.clearTimeout(id);
|
||||||
|
}
|
||||||
|
if (disappearAfter > -1) {
|
||||||
|
this.container.pendingMouseoutId =
|
||||||
|
window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mouseover: function() {
|
||||||
|
var id = this.container.pendingMouseoutId;
|
||||||
|
if (id) {
|
||||||
|
window.clearTimeout(id);
|
||||||
|
this.container.pendingMouseoutId = null;
|
||||||
|
}
|
||||||
|
this.hover(true);
|
||||||
|
if (this.container.menu.get_focused()) {
|
||||||
|
this.container.navigateTo(this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
navigate: function(keyCode) {
|
||||||
|
switch (this.keyMap[keyCode]) {
|
||||||
|
case this.keyMap.next:
|
||||||
|
this.navigateNext();
|
||||||
|
break;
|
||||||
|
case this.keyMap.previous:
|
||||||
|
this.navigatePrevious();
|
||||||
|
break;
|
||||||
|
case this.keyMap.child:
|
||||||
|
this.navigateChild();
|
||||||
|
break;
|
||||||
|
case this.keyMap.parent:
|
||||||
|
this.navigateParent();
|
||||||
|
break;
|
||||||
|
case this.keyMap.tab:
|
||||||
|
this.navigateOut();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
navigateChild: function() {
|
||||||
|
var subMenu = this.childMenu;
|
||||||
|
if (subMenu) {
|
||||||
|
var firstChild = subMenu.firstChild();
|
||||||
|
if (firstChild) {
|
||||||
|
this.container.navigateTo(firstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.container.orientation === 'horizontal') {
|
||||||
|
var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();
|
||||||
|
if (nextItem == this.topLevelMenuItem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.topLevelMenuItem.childMenu.hide();
|
||||||
|
this.container.navigateTo(nextItem);
|
||||||
|
if (nextItem.childMenu) {
|
||||||
|
this.container.navigateTo(nextItem.childMenu.firstChild());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
navigateNext: function() {
|
||||||
|
if (this.childMenu) {
|
||||||
|
this.childMenu.hide();
|
||||||
|
}
|
||||||
|
var nextMenuItem = this.nextSibling;
|
||||||
|
if (!nextMenuItem && this.parentMenu.isRoot()) {
|
||||||
|
nextMenuItem = this.parentMenu.parentMenuItem;
|
||||||
|
if (nextMenuItem) {
|
||||||
|
nextMenuItem = nextMenuItem.nextSibling;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!nextMenuItem) {
|
||||||
|
nextMenuItem = this.parentMenu.firstChild();
|
||||||
|
}
|
||||||
|
if (nextMenuItem) {
|
||||||
|
this.container.navigateTo(nextMenuItem);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
navigateOut: function() {
|
||||||
|
this.parentMenu.blur();
|
||||||
|
},
|
||||||
|
navigateParent: function() {
|
||||||
|
var parentMenu = this.parentMenu,
|
||||||
|
horizontal = this.container.orientation === 'horizontal';
|
||||||
|
if (!parentMenu) return;
|
||||||
|
if (horizontal && this.childMenu && parentMenu.isRoot()) {
|
||||||
|
this.navigateChild();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {
|
||||||
|
if (horizontal && this.parentMenu.depth === 2) {
|
||||||
|
var previousItem = this.parentMenu.parentMenuItem.previousSibling;
|
||||||
|
if (!previousItem) {
|
||||||
|
previousItem = this.parentMenu.rootMenu.lastChild();
|
||||||
|
}
|
||||||
|
this.topLevelMenuItem.childMenu.hide();
|
||||||
|
this.container.navigateTo(previousItem);
|
||||||
|
if (previousItem.childMenu) {
|
||||||
|
this.container.navigateTo(previousItem.childMenu.firstChild());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.parentMenu.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
navigatePrevious: function() {
|
||||||
|
if (this.childMenu) {
|
||||||
|
this.childMenu.hide();
|
||||||
|
}
|
||||||
|
var previousMenuItem = this.previousSibling;
|
||||||
|
if (previousMenuItem) {
|
||||||
|
var childMenu = previousMenuItem.childMenu;
|
||||||
|
if (childMenu && childMenu.isRoot()) {
|
||||||
|
previousMenuItem = childMenu.lastChild();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!previousMenuItem && this.parentMenu.isRoot()) {
|
||||||
|
previousMenuItem = this.parentMenu.parentMenuItem;
|
||||||
|
}
|
||||||
|
if (!previousMenuItem) {
|
||||||
|
previousMenuItem = this.parentMenu.lastChild();
|
||||||
|
}
|
||||||
|
if (previousMenuItem) {
|
||||||
|
this.container.navigateTo(previousMenuItem);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }
|
||||||
|
};
|
||||||
|
Sys.WebForms.MenuItem._onmouseout = function(e) {
|
||||||
|
var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);
|
||||||
|
if (!menuItem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
menuItem.mouseout();
|
||||||
|
Sys.WebForms.Menu._domHelper.cancelEvent(e);
|
||||||
|
};
|
||||||
|
Sys.WebForms.MenuItem._onmouseover = function(e) {
|
||||||
|
var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);
|
||||||
|
if (!menuItem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
menuItem.mouseover();
|
||||||
|
Sys.WebForms.Menu._domHelper.cancelEvent(e);
|
||||||
|
};
|
||||||
|
Sys.WebForms.Menu._domHelper = {
|
||||||
|
addEvent: function(element, eventName, fn, useCapture) {
|
||||||
|
if (element.addEventListener) {
|
||||||
|
element.addEventListener(eventName, fn, !!useCapture);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
element['on' + eventName] = fn;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
appendAttributeValue: function(element, name, value) {
|
||||||
|
this.updateAttributeValue('append', element, name, value);
|
||||||
|
},
|
||||||
|
appendCssClass: function(element, value) {
|
||||||
|
this.updateClassName('append', element, name, value);
|
||||||
|
},
|
||||||
|
appendString: function(getString, setString, value) {
|
||||||
|
var currentValue = getString();
|
||||||
|
if (!currentValue) {
|
||||||
|
setString(value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var regex = this._regexes.getRegex('(^| )' + value + '($| )');
|
||||||
|
if (regex.test(currentValue)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setString(currentValue + ' ' + value);
|
||||||
|
},
|
||||||
|
cancelEvent: function(e) {
|
||||||
|
var event = e || window.event;
|
||||||
|
if (event) {
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contains: function(ancestor, descendant) {
|
||||||
|
for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }
|
||||||
|
return !!descendant;
|
||||||
|
},
|
||||||
|
firstChild: function(element) {
|
||||||
|
var child = element.firstChild;
|
||||||
|
if (child && child.nodeType !== 1) {
|
||||||
|
child = this.nextSibling(child);
|
||||||
|
}
|
||||||
|
return child;
|
||||||
|
},
|
||||||
|
getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },
|
||||||
|
getElementDirection: function(element) {
|
||||||
|
if (element) {
|
||||||
|
if (element.dir) {
|
||||||
|
return element.dir;
|
||||||
|
}
|
||||||
|
return this.getElementDirection(element.parentNode);
|
||||||
|
}
|
||||||
|
return "ltr";
|
||||||
|
},
|
||||||
|
getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },
|
||||||
|
insertAfter: function(element, elementToInsert) {
|
||||||
|
var next = element.nextSibling;
|
||||||
|
if (next) {
|
||||||
|
element.parentNode.insertBefore(elementToInsert, next);
|
||||||
|
}
|
||||||
|
else if (element.parentNode) {
|
||||||
|
element.parentNode.appendChild(elementToInsert);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nextSibling: function(element) {
|
||||||
|
var sibling = element.nextSibling;
|
||||||
|
while (sibling) {
|
||||||
|
if (sibling.nodeType === 1) {
|
||||||
|
return sibling;
|
||||||
|
}
|
||||||
|
sibling = sibling.nextSibling;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
removeAttributeValue: function(element, name, value) {
|
||||||
|
this.updateAttributeValue('remove', element, name, value);
|
||||||
|
},
|
||||||
|
removeCssClass: function(element, value) {
|
||||||
|
this.updateClassName('remove', element, name, value);
|
||||||
|
},
|
||||||
|
removeEvent: function(element, eventName, fn, useCapture) {
|
||||||
|
if (element.removeEventListener) {
|
||||||
|
element.removeEventListener(eventName, fn, !!useCapture);
|
||||||
|
}
|
||||||
|
else if (element.detachEvent) {
|
||||||
|
element.detachEvent('on' + eventName, fn)
|
||||||
|
}
|
||||||
|
element['on' + eventName] = null;
|
||||||
|
},
|
||||||
|
removeString: function(getString, setString, valueToRemove) {
|
||||||
|
var currentValue = getString();
|
||||||
|
if (currentValue) {
|
||||||
|
var regex = this._regexes.getRegex('(\\s|\\b)' + valueToRemove + '$|\\b' + valueToRemove + '\\s+');
|
||||||
|
setString(currentValue.replace(regex, ''));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setFloat: function(element, direction) {
|
||||||
|
element.style.styleFloat = direction;
|
||||||
|
element.style.cssFloat = direction;
|
||||||
|
},
|
||||||
|
updateAttributeValue: function(operation, element, name, value) {
|
||||||
|
this[operation + 'String'](
|
||||||
|
function() {
|
||||||
|
return element.getAttribute(name);
|
||||||
|
},
|
||||||
|
function(newValue) {
|
||||||
|
element.setAttribute(name, newValue);
|
||||||
|
},
|
||||||
|
value
|
||||||
|
);
|
||||||
|
},
|
||||||
|
updateClassName: function(operation, element, name, value) {
|
||||||
|
this[operation + 'String'](
|
||||||
|
function() {
|
||||||
|
return element.className;
|
||||||
|
},
|
||||||
|
function(newValue) {
|
||||||
|
element.className = newValue;
|
||||||
|
},
|
||||||
|
value
|
||||||
|
);
|
||||||
|
},
|
||||||
|
_regexes: {
|
||||||
|
getRegex: function(pattern) {
|
||||||
|
var regex = this[pattern];
|
||||||
|
if (!regex) {
|
||||||
|
this[pattern] = regex = new RegExp(pattern);
|
||||||
|
}
|
||||||
|
return regex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms.Menu._elementObjectMapper = {
|
||||||
|
_computedId: 0,
|
||||||
|
_mappings: {},
|
||||||
|
_mappingIdName: 'Sys.WebForms.Menu.Mapping',
|
||||||
|
getMappedObject: function(element) {
|
||||||
|
var id = element[this._mappingIdName];
|
||||||
|
if (id) {
|
||||||
|
return this._mappings[this._mappingIdName + ':' + id];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
map: function(element, theObject) {
|
||||||
|
var mappedObject = element[this._mappingIdName];
|
||||||
|
if (mappedObject === theObject) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId);
|
||||||
|
element[this._mappingIdName] = objectId;
|
||||||
|
this._mappings[this._mappingIdName + ':' + objectId] = theObject;
|
||||||
|
theObject.mappingId = objectId;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms.Menu._keyboardMapping = new (function() {
|
||||||
|
var LEFT_ARROW = 37;
|
||||||
|
var UP_ARROW = 38;
|
||||||
|
var RIGHT_ARROW = 39;
|
||||||
|
var DOWN_ARROW = 40;
|
||||||
|
var TAB = 9;
|
||||||
|
var ESCAPE = 27;
|
||||||
|
this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };
|
||||||
|
this.vertical[DOWN_ARROW] = this.vertical.next;
|
||||||
|
this.vertical[UP_ARROW] = this.vertical.previous;
|
||||||
|
this.vertical[RIGHT_ARROW] = this.vertical.child;
|
||||||
|
this.vertical[LEFT_ARROW] = this.vertical.parent;
|
||||||
|
this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;
|
||||||
|
this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };
|
||||||
|
this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;
|
||||||
|
this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;
|
||||||
|
this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;
|
||||||
|
this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;
|
||||||
|
this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;
|
||||||
|
this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };
|
||||||
|
this.horizontal[RIGHT_ARROW] = this.horizontal.next;
|
||||||
|
this.horizontal[LEFT_ARROW] = this.horizontal.previous;
|
||||||
|
this.horizontal[DOWN_ARROW] = this.horizontal.child;
|
||||||
|
this.horizontal[UP_ARROW] = this.horizontal.parent;
|
||||||
|
this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;
|
||||||
|
this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };
|
||||||
|
this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;
|
||||||
|
this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;
|
||||||
|
this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;
|
||||||
|
this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;
|
||||||
|
this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;
|
||||||
|
this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {
|
||||||
|
return this[keycode] != null;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
Sys.WebForms._MenuContainer = function(options) {
|
||||||
|
this.focused = false;
|
||||||
|
this.disabled = options.disabled;
|
||||||
|
this.staticDisplayLevels = options.staticDisplayLevels || 1;
|
||||||
|
this.element = options.element;
|
||||||
|
this.orientation = options.orientation || 'vertical';
|
||||||
|
this.disappearAfter = options.disappearAfter;
|
||||||
|
this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';
|
||||||
|
Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);
|
||||||
|
this.menu = options.menu;
|
||||||
|
this.menu.rootMenu = this.menu;
|
||||||
|
this.menu.displayMode = 'static';
|
||||||
|
this.menu.element.style.position = 'relative';
|
||||||
|
this.menu.element.style.width = 'auto';
|
||||||
|
if (this.orientation === 'vertical') {
|
||||||
|
Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');
|
||||||
|
if (this.rightToLeft) {
|
||||||
|
this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');
|
||||||
|
if (this.rightToLeft) {
|
||||||
|
this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var floatBreak = document.createElement('div');
|
||||||
|
floatBreak.style.clear = this.rightToLeft ? "right" : "left";
|
||||||
|
this.element.appendChild(floatBreak);
|
||||||
|
Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? "right" : "left");
|
||||||
|
Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);
|
||||||
|
if (!this.disabled) {
|
||||||
|
Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);
|
||||||
|
Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);
|
||||||
|
var menuContainer = this;
|
||||||
|
this.element.dispose = function() {
|
||||||
|
if (menuContainer.element.dispose) {
|
||||||
|
menuContainer.element.dispose = null;
|
||||||
|
Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);
|
||||||
|
Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);
|
||||||
|
menuContainer.menu.doDispose();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {
|
||||||
|
if (menuContainer.element.dispose) {
|
||||||
|
menuContainer.element.dispose();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Sys.WebForms._MenuContainer.prototype = {
|
||||||
|
blur: function() {
|
||||||
|
this.focused = false;
|
||||||
|
this.isBlurring = false;
|
||||||
|
this.menu.collapse();
|
||||||
|
this.focusedMenuItem = null;
|
||||||
|
},
|
||||||
|
focus: function(e) { this.focused = true; },
|
||||||
|
navigateTo: function(menuItem) {
|
||||||
|
if (this.focusedMenuItem && this.focusedMenuItem !== this) {
|
||||||
|
this.focusedMenuItem.highlight(false);
|
||||||
|
}
|
||||||
|
menuItem.highlight(true);
|
||||||
|
menuItem.focus();
|
||||||
|
this.focusedMenuItem = menuItem;
|
||||||
|
},
|
||||||
|
_onfocus: function(e) {
|
||||||
|
var event = e || window.event;
|
||||||
|
if (event.srcElement && this) {
|
||||||
|
if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {
|
||||||
|
if (!this.focused) {
|
||||||
|
this.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_onkeydown: function(e) {
|
||||||
|
var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);
|
||||||
|
var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);
|
||||||
|
if (thisMenu) {
|
||||||
|
thisMenu.handleKeyPress(keyCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,280 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js
|
||||||
|
var snSrc;
|
||||||
|
if ((typeof(window.__smartNav) == "undefined") || (window.__smartNav == null))
|
||||||
|
{
|
||||||
|
window.__smartNav = new Object();
|
||||||
|
window.__smartNav.update = function()
|
||||||
|
{
|
||||||
|
var sn = window.__smartNav;
|
||||||
|
var fd;
|
||||||
|
document.detachEvent("onstop", sn.stopHif);
|
||||||
|
sn.inPost = false;
|
||||||
|
try { fd = frames["__hifSmartNav"].document; } catch (e) {return;}
|
||||||
|
var fdr = fd.getElementsByTagName("asp_smartnav_rdir");
|
||||||
|
if (fdr.length > 0)
|
||||||
|
{
|
||||||
|
if ((typeof(sn.sHif) == "undefined") || (sn.sHif == null))
|
||||||
|
{
|
||||||
|
sn.sHif = document.createElement("IFRAME");
|
||||||
|
sn.sHif.name = "__hifSmartNav";
|
||||||
|
sn.sHif.style.display = "none";
|
||||||
|
sn.sHif.src = snSrc;
|
||||||
|
}
|
||||||
|
try {window.location = fdr[0].url;} catch (e) {};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var fdurl = fd.location.href;
|
||||||
|
var index = fdurl.indexOf(snSrc);
|
||||||
|
if ((index != -1 && index == fdurl.length-snSrc.length)
|
||||||
|
|| fdurl == "about:blank")
|
||||||
|
return;
|
||||||
|
var fdurlb = fdurl.split("?")[0];
|
||||||
|
if (document.location.href.indexOf(fdurlb) < 0)
|
||||||
|
{
|
||||||
|
document.location.href=fdurl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sn._savedOnLoad = window.onload;
|
||||||
|
window.onload = null;
|
||||||
|
window.__smartNav.updateHelper();
|
||||||
|
}
|
||||||
|
window.__smartNav.updateHelper = function()
|
||||||
|
{
|
||||||
|
if (document.readyState != "complete")
|
||||||
|
{
|
||||||
|
window.setTimeout(window.__smartNav.updateHelper, 25);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.__smartNav.loadNewContent();
|
||||||
|
}
|
||||||
|
window.__smartNav.loadNewContent = function()
|
||||||
|
{
|
||||||
|
var sn = window.__smartNav;
|
||||||
|
var fd;
|
||||||
|
try { fd = frames["__hifSmartNav"].document; } catch (e) {return;}
|
||||||
|
if ((typeof(sn.sHif) != "undefined") && (sn.sHif != null))
|
||||||
|
{
|
||||||
|
sn.sHif.removeNode(true);
|
||||||
|
sn.sHif = null;
|
||||||
|
}
|
||||||
|
var hdm = document.getElementsByTagName("head")[0];
|
||||||
|
var hk = hdm.childNodes;
|
||||||
|
var tt = null;
|
||||||
|
var i;
|
||||||
|
for (i = hk.length - 1; i>= 0; i--)
|
||||||
|
{
|
||||||
|
if (hk[i].tagName == "TITLE")
|
||||||
|
{
|
||||||
|
tt = hk[i].outerHTML;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (hk[i].tagName != "BASEFONT" || hk[i].innerHTML.length == 0)
|
||||||
|
hdm.removeChild(hdm.childNodes[i]);
|
||||||
|
}
|
||||||
|
var kids = fd.getElementsByTagName("head")[0].childNodes;
|
||||||
|
for (i = 0; i < kids.length; i++)
|
||||||
|
{
|
||||||
|
var tn = kids[i].tagName;
|
||||||
|
var k = document.createElement(tn);
|
||||||
|
k.id = kids[i].id;
|
||||||
|
k.mergeAttributes(kids[i]);
|
||||||
|
switch(tn)
|
||||||
|
{
|
||||||
|
case "TITLE":
|
||||||
|
if (tt == kids[i].outerHTML)
|
||||||
|
continue;
|
||||||
|
k.innerText = kids[i].text;
|
||||||
|
hdm.insertAdjacentElement("afterbegin", k);
|
||||||
|
continue;
|
||||||
|
case "BASEFONT" :
|
||||||
|
if (kids[i].innerHTML.length > 0)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
var o = document.createElement("BODY");
|
||||||
|
o.innerHTML = "<BODY>" + kids[i].outerHTML + "</BODY>";
|
||||||
|
k = o.firstChild;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if((typeof(k) != "undefined") && (k != null))
|
||||||
|
hdm.appendChild(k);
|
||||||
|
}
|
||||||
|
document.body.clearAttributes();
|
||||||
|
document.body.id = fd.body.id;
|
||||||
|
document.body.mergeAttributes(fd.body);
|
||||||
|
var newBodyLoad = fd.body.onload;
|
||||||
|
if ((typeof(newBodyLoad) != "undefined") && (newBodyLoad != null))
|
||||||
|
document.body.onload = newBodyLoad;
|
||||||
|
else
|
||||||
|
document.body.onload = sn._savedOnLoad;
|
||||||
|
var s = "<BODY>" + fd.body.innerHTML + "</BODY>";
|
||||||
|
if ((typeof(sn.hif) != "undefined") && (sn.hif != null))
|
||||||
|
{
|
||||||
|
var hifP = sn.hif.parentElement;
|
||||||
|
if ((typeof(hifP) != "undefined") && (hifP != null))
|
||||||
|
sn.sHif=hifP.removeChild(sn.hif);
|
||||||
|
}
|
||||||
|
document.body.innerHTML = s;
|
||||||
|
var sc = document.scripts;
|
||||||
|
for (i = 0; i < sc.length; i++)
|
||||||
|
{
|
||||||
|
sc[i].text = sc[i].text;
|
||||||
|
}
|
||||||
|
sn.hif = document.all("__hifSmartNav");
|
||||||
|
if ((typeof(sn.hif) != "undefined") && (sn.hif != null))
|
||||||
|
{
|
||||||
|
var hif = sn.hif;
|
||||||
|
sn.hifName = "__hifSmartNav" + (new Date()).getTime();
|
||||||
|
frames["__hifSmartNav"].name = sn.hifName;
|
||||||
|
sn.hifDoc = hif.contentWindow.document;
|
||||||
|
if (sn.ie5)
|
||||||
|
hif.parentElement.removeChild(hif);
|
||||||
|
window.setTimeout(sn.restoreFocus,0);
|
||||||
|
}
|
||||||
|
if (typeof(window.onload) == "string")
|
||||||
|
{
|
||||||
|
try { eval(window.onload) } catch (e) {};
|
||||||
|
}
|
||||||
|
else if ((typeof(window.onload) != "undefined") && (window.onload != null))
|
||||||
|
{
|
||||||
|
try { window.onload() } catch (e) {};
|
||||||
|
}
|
||||||
|
sn._savedOnLoad = null;
|
||||||
|
sn.attachForm();
|
||||||
|
};
|
||||||
|
window.__smartNav.restoreFocus = function()
|
||||||
|
{
|
||||||
|
if (window.__smartNav.inPost == true) return;
|
||||||
|
var curAe = document.activeElement;
|
||||||
|
var sAeId = window.__smartNav.ae;
|
||||||
|
if (((typeof(sAeId) == "undefined") || (sAeId == null)) ||
|
||||||
|
(typeof(curAe) != "undefined") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))
|
||||||
|
return;
|
||||||
|
var ae = document.all(sAeId);
|
||||||
|
if ((typeof(ae) == "undefined") || (ae == null)) return;
|
||||||
|
try { ae.focus(); } catch(e){};
|
||||||
|
}
|
||||||
|
window.__smartNav.saveHistory = function()
|
||||||
|
{
|
||||||
|
if ((typeof(window.__smartNav.hif) != "undefined") && (window.__smartNav.hif != null))
|
||||||
|
window.__smartNav.hif.removeNode();
|
||||||
|
if ((typeof(window.__smartNav.sHif) != "undefined") && (window.__smartNav.sHif != null)
|
||||||
|
&& (typeof(document.all[window.__smartNav.siHif]) != "undefined")
|
||||||
|
&& (document.all[window.__smartNav.siHif] != null)) {
|
||||||
|
document.all[window.__smartNav.siHif].insertAdjacentElement(
|
||||||
|
"BeforeBegin", window.__smartNav.sHif);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.__smartNav.stopHif = function()
|
||||||
|
{
|
||||||
|
document.detachEvent("onstop", window.__smartNav.stopHif);
|
||||||
|
var sn = window.__smartNav;
|
||||||
|
if (((typeof(sn.hifDoc) == "undefined") || (sn.hifDoc == null)) &&
|
||||||
|
(typeof(sn.hif) != "undefined") && (sn.hif != null))
|
||||||
|
{
|
||||||
|
try {sn.hifDoc = sn.hif.contentWindow.document;}
|
||||||
|
catch(e){sn.hifDoc=null}
|
||||||
|
}
|
||||||
|
if (sn.hifDoc != null)
|
||||||
|
{
|
||||||
|
try {sn.hifDoc.execCommand("stop");} catch (e){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.__smartNav.init = function()
|
||||||
|
{
|
||||||
|
var sn = window.__smartNav;
|
||||||
|
window.__smartNav.form.__smartNavPostBack.value = 'true';
|
||||||
|
document.detachEvent("onstop", sn.stopHif);
|
||||||
|
document.attachEvent("onstop", sn.stopHif);
|
||||||
|
try { if (window.event.returnValue == false) return; } catch(e) {}
|
||||||
|
sn.inPost = true;
|
||||||
|
if ((typeof(document.activeElement) != "undefined") && (document.activeElement != null))
|
||||||
|
{
|
||||||
|
var ae = document.activeElement.id;
|
||||||
|
if (ae.length == 0)
|
||||||
|
ae = document.activeElement.name;
|
||||||
|
sn.ae = ae;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sn.ae = null;
|
||||||
|
try {document.selection.empty();} catch (e) {}
|
||||||
|
if ((typeof(sn.hif) == "undefined") || (sn.hif == null))
|
||||||
|
{
|
||||||
|
sn.hif = document.all("__hifSmartNav");
|
||||||
|
sn.hifDoc = sn.hif.contentWindow.document;
|
||||||
|
}
|
||||||
|
if ((typeof(sn.hifDoc) != "undefined") && (sn.hifDoc != null))
|
||||||
|
try {sn.hifDoc.designMode = "On";} catch(e){};
|
||||||
|
if ((typeof(sn.hif.parentElement) == "undefined") || (sn.hif.parentElement == null))
|
||||||
|
document.body.appendChild(sn.hif);
|
||||||
|
var hif = sn.hif;
|
||||||
|
hif.detachEvent("onload", sn.update);
|
||||||
|
hif.attachEvent("onload", sn.update);
|
||||||
|
window.__smartNav.fInit = true;
|
||||||
|
};
|
||||||
|
window.__smartNav.submit = function()
|
||||||
|
{
|
||||||
|
window.__smartNav.fInit = false;
|
||||||
|
try { window.__smartNav.init(); } catch(e) {}
|
||||||
|
if (window.__smartNav.fInit) {
|
||||||
|
window.__smartNav.form._submit();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.__smartNav.attachForm = function()
|
||||||
|
{
|
||||||
|
var cf = document.forms;
|
||||||
|
for (var i=0; i<cf.length; i++)
|
||||||
|
{
|
||||||
|
if ((typeof(cf[i].__smartNavEnabled) != "undefined") && (cf[i].__smartNavEnabled != null))
|
||||||
|
{
|
||||||
|
window.__smartNav.form = cf[i];
|
||||||
|
window.__smartNav.form.insertAdjacentHTML("beforeEnd", "<input type='hidden' name='__smartNavPostBack' value='false' />");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var snfm = window.__smartNav.form;
|
||||||
|
if ((typeof(snfm) == "undefined") || (snfm == null)) return false;
|
||||||
|
var sft = snfm.target;
|
||||||
|
if (sft.length != 0 && sft.indexOf("__hifSmartNav") != 0) return false;
|
||||||
|
var sfc = snfm.action.split("?")[0];
|
||||||
|
var url = window.location.href.split("?")[0];
|
||||||
|
if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;
|
||||||
|
if (snfm.__formAttached == true) return true;
|
||||||
|
snfm.__formAttached = true;
|
||||||
|
snfm.attachEvent("onsubmit", window.__smartNav.init);
|
||||||
|
snfm._submit = snfm.submit;
|
||||||
|
snfm.submit = window.__smartNav.submit;
|
||||||
|
snfm.target = window.__smartNav.hifName;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
window.__smartNav.hifName = "__hifSmartNav" + (new Date()).getTime();
|
||||||
|
window.__smartNav.ie5 = navigator.appVersion.indexOf("MSIE 5") > 0;
|
||||||
|
var rc = window.__smartNav.attachForm();
|
||||||
|
var hif = document.all("__hifSmartNav");
|
||||||
|
if ((typeof(snSrc) == "undefined") || (snSrc == null)) {
|
||||||
|
if (typeof(window.dialogHeight) != "undefined") {
|
||||||
|
snSrc = "IEsmartnav1";
|
||||||
|
hif.src = snSrc;
|
||||||
|
} else {
|
||||||
|
snSrc = hif.src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
var fsn = frames["__hifSmartNav"];
|
||||||
|
fsn.name = window.__smartNav.hifName;
|
||||||
|
window.__smartNav.siHif = hif.sourceIndex;
|
||||||
|
try {
|
||||||
|
if (fsn.document.location != snSrc)
|
||||||
|
{
|
||||||
|
fsn.document.designMode = "On";
|
||||||
|
hif.attachEvent("onload",window.__smartNav.update);
|
||||||
|
window.__smartNav.hif = hif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) { window.__smartNav.hif = hif; }
|
||||||
|
window.attachEvent("onbeforeunload", window.__smartNav.saveHistory);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
window.__smartNav = null;
|
||||||
|
}
|
@ -0,0 +1,220 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js
|
||||||
|
function TreeView_HoverNode(data, node) {
|
||||||
|
if (!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
node.hoverClass = data.hoverClass;
|
||||||
|
WebForm_AppendToClassName(node, data.hoverClass);
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
node = node.childNodes[node.childNodes.length - 1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
node = node.children[node.children.length - 1];
|
||||||
|
}
|
||||||
|
node.hoverHyperLinkClass = data.hoverHyperLinkClass;
|
||||||
|
WebForm_AppendToClassName(node, data.hoverHyperLinkClass);
|
||||||
|
}
|
||||||
|
function TreeView_GetNodeText(node) {
|
||||||
|
var trNode = WebForm_GetParentByTagName(node, "TR");
|
||||||
|
var outerNodes;
|
||||||
|
if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {
|
||||||
|
outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName("A");
|
||||||
|
if (!outerNodes || outerNodes.length == 0) {
|
||||||
|
outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName("SPAN");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var textNode = (outerNodes && outerNodes.length > 0) ?
|
||||||
|
outerNodes[0].childNodes[0] :
|
||||||
|
trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];
|
||||||
|
return (textNode && textNode.nodeValue) ? textNode.nodeValue : "";
|
||||||
|
}
|
||||||
|
function TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {
|
||||||
|
if (!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var context = new Object();
|
||||||
|
context.data = data;
|
||||||
|
context.node = node;
|
||||||
|
context.selectNode = selectNode;
|
||||||
|
context.selectImageNode = selectImageNode;
|
||||||
|
context.lineType = lineType;
|
||||||
|
context.index = index;
|
||||||
|
context.isChecked = "f";
|
||||||
|
var tr = WebForm_GetParentByTagName(node, "TR");
|
||||||
|
if (tr) {
|
||||||
|
var checkbox = tr.getElementsByTagName("INPUT");
|
||||||
|
if (checkbox && (checkbox.length > 0)) {
|
||||||
|
for (var i = 0; i < checkbox.length; i++) {
|
||||||
|
if (checkbox[i].type.toLowerCase() == "checkbox") {
|
||||||
|
if (checkbox[i].checked) {
|
||||||
|
context.isChecked = "t";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var param = index + "|" + data.lastIndex + "|" + databound + context.isChecked + parentIsLast + "|" +
|
||||||
|
text.length + "|" + text + datapath.length + "|" + datapath + path;
|
||||||
|
TreeView_PopulateNodeDoCallBack(context, param);
|
||||||
|
}
|
||||||
|
function TreeView_ProcessNodeData(result, context) {
|
||||||
|
var treeNode = context.node;
|
||||||
|
if (result.length > 0) {
|
||||||
|
var ci = result.indexOf("|", 0);
|
||||||
|
context.data.lastIndex = result.substring(0, ci);
|
||||||
|
ci = result.indexOf("|", ci + 1);
|
||||||
|
var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);
|
||||||
|
context.data.expandState.value += newExpandState;
|
||||||
|
var chunk = result.substr(ci + 1);
|
||||||
|
var newChildren, table;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
var newDiv = document.createElement("div");
|
||||||
|
newDiv.innerHTML = chunk;
|
||||||
|
table = WebForm_GetParentByTagName(treeNode, "TABLE");
|
||||||
|
newChildren = null;
|
||||||
|
if ((typeof(table.nextSibling) == "undefined") || (table.nextSibling == null)) {
|
||||||
|
table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);
|
||||||
|
newChildren = table.previousSibling;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
table = table.nextSibling;
|
||||||
|
table.parentNode.insertBefore(newDiv.firstChild, table);
|
||||||
|
newChildren = table.previousSibling;
|
||||||
|
}
|
||||||
|
newChildren = document.getElementById(treeNode.id + "Nodes");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
table = WebForm_GetParentByTagName(treeNode, "TABLE");
|
||||||
|
table.insertAdjacentHTML("afterEnd", chunk);
|
||||||
|
newChildren = document.all[treeNode.id + "Nodes"];
|
||||||
|
}
|
||||||
|
if ((typeof(newChildren) != "undefined") && (newChildren != null)) {
|
||||||
|
TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);
|
||||||
|
treeNode.href = document.getElementById ?
|
||||||
|
"javascript:TreeView_ToggleNode(" + context.data.name + "," + context.index + ",document.getElementById('" + treeNode.id + "'),'" + context.lineType + "',document.getElementById('" + newChildren.id + "'))" :
|
||||||
|
"javascript:TreeView_ToggleNode(" + context.data.name + "," + context.index + "," + treeNode.id + ",'" + context.lineType + "'," + newChildren.id + ")";
|
||||||
|
if ((typeof(context.selectNode) != "undefined") && (context.selectNode != null) && context.selectNode.href &&
|
||||||
|
(context.selectNode.href.indexOf("javascript:TreeView_PopulateNode", 0) == 0)) {
|
||||||
|
context.selectNode.href = treeNode.href;
|
||||||
|
}
|
||||||
|
if ((typeof(context.selectImageNode) != "undefined") && (context.selectImageNode != null) && context.selectNode.href &&
|
||||||
|
(context.selectImageNode.href.indexOf("javascript:TreeView_PopulateNode", 0) == 0)) {
|
||||||
|
context.selectImageNode.href = treeNode.href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
context.data.populateLog.value += context.index + ",";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];
|
||||||
|
if ((typeof(img) != "undefined") && (img != null)) {
|
||||||
|
var lineType = context.lineType;
|
||||||
|
if (lineType == "l") {
|
||||||
|
img.src = context.data.images[13];
|
||||||
|
}
|
||||||
|
else if (lineType == "t") {
|
||||||
|
img.src = context.data.images[10];
|
||||||
|
}
|
||||||
|
else if (lineType == "-") {
|
||||||
|
img.src = context.data.images[16];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
img.src = context.data.images[3];
|
||||||
|
}
|
||||||
|
var pe;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
pe = treeNode.parentNode;
|
||||||
|
pe.insertBefore(img, treeNode);
|
||||||
|
pe.removeChild(treeNode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pe = treeNode.parentElement;
|
||||||
|
treeNode.style.visibility="hidden";
|
||||||
|
treeNode.style.display="none";
|
||||||
|
pe.insertAdjacentElement("afterBegin", img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function TreeView_SelectNode(data, node, nodeId) {
|
||||||
|
if (!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((typeof(data.selectedClass) != "undefined") && (data.selectedClass != null)) {
|
||||||
|
var id = data.selectedNodeID.value;
|
||||||
|
if (id.length > 0) {
|
||||||
|
var selectedNode = document.getElementById(id);
|
||||||
|
if ((typeof(selectedNode) != "undefined") && (selectedNode != null)) {
|
||||||
|
WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);
|
||||||
|
selectedNode = WebForm_GetParentByTagName(selectedNode, "TD");
|
||||||
|
WebForm_RemoveClassName(selectedNode, data.selectedClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WebForm_AppendToClassName(node, data.selectedHyperLinkClass);
|
||||||
|
node = WebForm_GetParentByTagName(node, "TD");
|
||||||
|
WebForm_AppendToClassName(node, data.selectedClass)
|
||||||
|
}
|
||||||
|
data.selectedNodeID.value = nodeId;
|
||||||
|
}
|
||||||
|
function TreeView_ToggleNode(data, index, node, lineType, children) {
|
||||||
|
if (!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var img = node.childNodes[0];
|
||||||
|
var newExpandState;
|
||||||
|
try {
|
||||||
|
if (children.style.display == "none") {
|
||||||
|
children.style.display = "block";
|
||||||
|
newExpandState = "e";
|
||||||
|
if ((typeof(img) != "undefined") && (img != null)) {
|
||||||
|
if (lineType == "l") {
|
||||||
|
img.src = data.images[15];
|
||||||
|
}
|
||||||
|
else if (lineType == "t") {
|
||||||
|
img.src = data.images[12];
|
||||||
|
}
|
||||||
|
else if (lineType == "-") {
|
||||||
|
img.src = data.images[18];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
img.src = data.images[5];
|
||||||
|
}
|
||||||
|
img.alt = data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
children.style.display = "none";
|
||||||
|
newExpandState = "c";
|
||||||
|
if ((typeof(img) != "undefined") && (img != null)) {
|
||||||
|
if (lineType == "l") {
|
||||||
|
img.src = data.images[14];
|
||||||
|
}
|
||||||
|
else if (lineType == "t") {
|
||||||
|
img.src = data.images[11];
|
||||||
|
}
|
||||||
|
else if (lineType == "-") {
|
||||||
|
img.src = data.images[17];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
img.src = data.images[4];
|
||||||
|
}
|
||||||
|
img.alt = data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
data.expandState.value = data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
|
||||||
|
}
|
||||||
|
function TreeView_UnhoverNode(node) {
|
||||||
|
if (!node.hoverClass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WebForm_RemoveClassName(node, node.hoverClass);
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
node = node.childNodes[node.childNodes.length - 1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
node = node.children[node.children.length - 1];
|
||||||
|
}
|
||||||
|
WebForm_RemoveClassName(node, node.hoverHyperLinkClass);
|
||||||
|
}
|
@ -0,0 +1,567 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js
|
||||||
|
function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {
|
||||||
|
this.eventTarget = eventTarget;
|
||||||
|
this.eventArgument = eventArgument;
|
||||||
|
this.validation = validation;
|
||||||
|
this.validationGroup = validationGroup;
|
||||||
|
this.actionUrl = actionUrl;
|
||||||
|
this.trackFocus = trackFocus;
|
||||||
|
this.clientSubmit = clientSubmit;
|
||||||
|
}
|
||||||
|
function WebForm_DoPostBackWithOptions(options) {
|
||||||
|
var validationResult = true;
|
||||||
|
if (options.validation) {
|
||||||
|
if (typeof(Page_ClientValidate) == 'function') {
|
||||||
|
validationResult = Page_ClientValidate(options.validationGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (validationResult) {
|
||||||
|
if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
|
||||||
|
theForm.action = options.actionUrl;
|
||||||
|
}
|
||||||
|
if (options.trackFocus) {
|
||||||
|
var lastFocus = theForm.elements["__LASTFOCUS"];
|
||||||
|
if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
|
||||||
|
if (typeof(document.activeElement) == "undefined") {
|
||||||
|
lastFocus.value = options.eventTarget;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var active = document.activeElement;
|
||||||
|
if ((typeof(active) != "undefined") && (active != null)) {
|
||||||
|
if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {
|
||||||
|
lastFocus.value = active.id;
|
||||||
|
}
|
||||||
|
else if (typeof(active.name) != "undefined") {
|
||||||
|
lastFocus.value = active.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (options.clientSubmit) {
|
||||||
|
__doPostBack(options.eventTarget, options.eventArgument);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var __pendingCallbacks = new Array();
|
||||||
|
var __synchronousCallBackIndex = -1;
|
||||||
|
function WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {
|
||||||
|
var postData = __theFormPostData +
|
||||||
|
"__CALLBACKID=" + WebForm_EncodeCallback(eventTarget) +
|
||||||
|
"&__CALLBACKPARAM=" + WebForm_EncodeCallback(eventArgument);
|
||||||
|
if (theForm["__EVENTVALIDATION"]) {
|
||||||
|
postData += "&__EVENTVALIDATION=" + WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value);
|
||||||
|
}
|
||||||
|
var xmlRequest,e;
|
||||||
|
try {
|
||||||
|
xmlRequest = new XMLHttpRequest();
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
try {
|
||||||
|
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var setRequestHeaderMethodExists = true;
|
||||||
|
try {
|
||||||
|
setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
var callback = new Object();
|
||||||
|
callback.eventCallback = eventCallback;
|
||||||
|
callback.context = context;
|
||||||
|
callback.errorCallback = errorCallback;
|
||||||
|
callback.async = useAsync;
|
||||||
|
var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);
|
||||||
|
if (!useAsync) {
|
||||||
|
if (__synchronousCallBackIndex != -1) {
|
||||||
|
__pendingCallbacks[__synchronousCallBackIndex] = null;
|
||||||
|
}
|
||||||
|
__synchronousCallBackIndex = callbackIndex;
|
||||||
|
}
|
||||||
|
if (setRequestHeaderMethodExists) {
|
||||||
|
xmlRequest.onreadystatechange = WebForm_CallbackComplete;
|
||||||
|
callback.xmlRequest = xmlRequest;
|
||||||
|
// e.g. http:
|
||||||
|
var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');
|
||||||
|
if (fragmentIndex !== -1) {
|
||||||
|
action = action.substr(0, fragmentIndex);
|
||||||
|
}
|
||||||
|
if (!__nonMSDOMBrowser) {
|
||||||
|
var queryIndex = action.indexOf('?');
|
||||||
|
if (queryIndex !== -1) {
|
||||||
|
var path = action.substr(0, queryIndex);
|
||||||
|
if (path.indexOf("%") === -1) {
|
||||||
|
action = encodeURI(path) + action.substr(queryIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (action.indexOf("%") === -1) {
|
||||||
|
action = encodeURI(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlRequest.open("POST", action, true);
|
||||||
|
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
|
||||||
|
xmlRequest.send(postData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback.xmlRequest = new Object();
|
||||||
|
var callbackFrameID = "__CALLBACKFRAME" + callbackIndex;
|
||||||
|
var xmlRequestFrame = document.frames[callbackFrameID];
|
||||||
|
if (!xmlRequestFrame) {
|
||||||
|
xmlRequestFrame = document.createElement("IFRAME");
|
||||||
|
xmlRequestFrame.width = "1";
|
||||||
|
xmlRequestFrame.height = "1";
|
||||||
|
xmlRequestFrame.frameBorder = "0";
|
||||||
|
xmlRequestFrame.id = callbackFrameID;
|
||||||
|
xmlRequestFrame.name = callbackFrameID;
|
||||||
|
xmlRequestFrame.style.position = "absolute";
|
||||||
|
xmlRequestFrame.style.top = "-100px"
|
||||||
|
xmlRequestFrame.style.left = "-100px";
|
||||||
|
try {
|
||||||
|
if (callBackFrameUrl) {
|
||||||
|
xmlRequestFrame.src = callBackFrameUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
document.body.appendChild(xmlRequestFrame);
|
||||||
|
}
|
||||||
|
var interval = window.setInterval(function() {
|
||||||
|
xmlRequestFrame = document.frames[callbackFrameID];
|
||||||
|
if (xmlRequestFrame && xmlRequestFrame.document) {
|
||||||
|
window.clearInterval(interval);
|
||||||
|
xmlRequestFrame.document.write("");
|
||||||
|
xmlRequestFrame.document.close();
|
||||||
|
xmlRequestFrame.document.write('<html><body><form method="post"><input type="hidden" name="__CALLBACKLOADSCRIPT" value="t"></form></body></html>');
|
||||||
|
xmlRequestFrame.document.close();
|
||||||
|
xmlRequestFrame.document.forms[0].action = theForm.action;
|
||||||
|
var count = __theFormPostCollection.length;
|
||||||
|
var element;
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
element = __theFormPostCollection[i];
|
||||||
|
if (element) {
|
||||||
|
var fieldElement = xmlRequestFrame.document.createElement("INPUT");
|
||||||
|
fieldElement.type = "hidden";
|
||||||
|
fieldElement.name = element.name;
|
||||||
|
fieldElement.value = element.value;
|
||||||
|
xmlRequestFrame.document.forms[0].appendChild(fieldElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var callbackIdFieldElement = xmlRequestFrame.document.createElement("INPUT");
|
||||||
|
callbackIdFieldElement.type = "hidden";
|
||||||
|
callbackIdFieldElement.name = "__CALLBACKID";
|
||||||
|
callbackIdFieldElement.value = eventTarget;
|
||||||
|
xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);
|
||||||
|
var callbackParamFieldElement = xmlRequestFrame.document.createElement("INPUT");
|
||||||
|
callbackParamFieldElement.type = "hidden";
|
||||||
|
callbackParamFieldElement.name = "__CALLBACKPARAM";
|
||||||
|
callbackParamFieldElement.value = eventArgument;
|
||||||
|
xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);
|
||||||
|
if (theForm["__EVENTVALIDATION"]) {
|
||||||
|
var callbackValidationFieldElement = xmlRequestFrame.document.createElement("INPUT");
|
||||||
|
callbackValidationFieldElement.type = "hidden";
|
||||||
|
callbackValidationFieldElement.name = "__EVENTVALIDATION";
|
||||||
|
callbackValidationFieldElement.value = theForm["__EVENTVALIDATION"].value;
|
||||||
|
xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);
|
||||||
|
}
|
||||||
|
var callbackIndexFieldElement = xmlRequestFrame.document.createElement("INPUT");
|
||||||
|
callbackIndexFieldElement.type = "hidden";
|
||||||
|
callbackIndexFieldElement.name = "__CALLBACKINDEX";
|
||||||
|
callbackIndexFieldElement.value = callbackIndex;
|
||||||
|
xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);
|
||||||
|
xmlRequestFrame.document.forms[0].submit();
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
}
|
||||||
|
function WebForm_CallbackComplete() {
|
||||||
|
for (var i = 0; i < __pendingCallbacks.length; i++) {
|
||||||
|
callbackObject = __pendingCallbacks[i];
|
||||||
|
if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
|
||||||
|
if (!__pendingCallbacks[i].async) {
|
||||||
|
__synchronousCallBackIndex = -1;
|
||||||
|
}
|
||||||
|
__pendingCallbacks[i] = null;
|
||||||
|
var callbackFrameID = "__CALLBACKFRAME" + i;
|
||||||
|
var xmlRequestFrame = document.getElementById(callbackFrameID);
|
||||||
|
if (xmlRequestFrame) {
|
||||||
|
xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
|
||||||
|
}
|
||||||
|
WebForm_ExecuteCallback(callbackObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_ExecuteCallback(callbackObject) {
|
||||||
|
var response = callbackObject.xmlRequest.responseText;
|
||||||
|
if (response.charAt(0) == "s") {
|
||||||
|
if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
|
||||||
|
callbackObject.eventCallback(response.substring(1), callbackObject.context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (response.charAt(0) == "e") {
|
||||||
|
if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {
|
||||||
|
callbackObject.errorCallback(response.substring(1), callbackObject.context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var separatorIndex = response.indexOf("|");
|
||||||
|
if (separatorIndex != -1) {
|
||||||
|
var validationFieldLength = parseInt(response.substring(0, separatorIndex));
|
||||||
|
if (!isNaN(validationFieldLength)) {
|
||||||
|
var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);
|
||||||
|
if (validationField != "") {
|
||||||
|
var validationFieldElement = theForm["__EVENTVALIDATION"];
|
||||||
|
if (!validationFieldElement) {
|
||||||
|
validationFieldElement = document.createElement("INPUT");
|
||||||
|
validationFieldElement.type = "hidden";
|
||||||
|
validationFieldElement.name = "__EVENTVALIDATION";
|
||||||
|
theForm.appendChild(validationFieldElement);
|
||||||
|
}
|
||||||
|
validationFieldElement.value = validationField;
|
||||||
|
}
|
||||||
|
if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
|
||||||
|
callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_FillFirstAvailableSlot(array, element) {
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < array.length; i++) {
|
||||||
|
if (!array[i]) break;
|
||||||
|
}
|
||||||
|
array[i] = element;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);
|
||||||
|
var __theFormPostData = "";
|
||||||
|
var __theFormPostCollection = new Array();
|
||||||
|
var __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;
|
||||||
|
function WebForm_InitCallback() {
|
||||||
|
var formElements = theForm.elements,
|
||||||
|
count = formElements.length,
|
||||||
|
element;
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
element = formElements[i];
|
||||||
|
var tagName = element.tagName.toLowerCase();
|
||||||
|
if (tagName == "input") {
|
||||||
|
var type = element.type;
|
||||||
|
if ((__callbackTextTypes.test(type) || ((type == "checkbox" || type == "radio") && element.checked))
|
||||||
|
&& (element.id != "__EVENTVALIDATION")) {
|
||||||
|
WebForm_InitCallbackAddField(element.name, element.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tagName == "select") {
|
||||||
|
var selectCount = element.options.length;
|
||||||
|
for (var j = 0; j < selectCount; j++) {
|
||||||
|
var selectChild = element.options[j];
|
||||||
|
if (selectChild.selected == true) {
|
||||||
|
WebForm_InitCallbackAddField(element.name, element.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tagName == "textarea") {
|
||||||
|
WebForm_InitCallbackAddField(element.name, element.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_InitCallbackAddField(name, value) {
|
||||||
|
var nameValue = new Object();
|
||||||
|
nameValue.name = name;
|
||||||
|
nameValue.value = value;
|
||||||
|
__theFormPostCollection[__theFormPostCollection.length] = nameValue;
|
||||||
|
__theFormPostData += WebForm_EncodeCallback(name) + "=" + WebForm_EncodeCallback(value) + "&";
|
||||||
|
}
|
||||||
|
function WebForm_EncodeCallback(parameter) {
|
||||||
|
if (encodeURIComponent) {
|
||||||
|
return encodeURIComponent(parameter);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return escape(parameter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var __disabledControlArray = new Array();
|
||||||
|
function WebForm_ReEnableControls() {
|
||||||
|
if (typeof(__enabledControlArray) == 'undefined') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var disabledIndex = 0;
|
||||||
|
for (var i = 0; i < __enabledControlArray.length; i++) {
|
||||||
|
var c;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
c = document.getElementById(__enabledControlArray[i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c = document.all[__enabledControlArray[i]];
|
||||||
|
}
|
||||||
|
if ((typeof(c) != "undefined") && (c != null) && (c.disabled == true)) {
|
||||||
|
c.disabled = false;
|
||||||
|
__disabledControlArray[disabledIndex++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setTimeout("WebForm_ReDisableControls()", 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_ReDisableControls() {
|
||||||
|
for (var i = 0; i < __disabledControlArray.length; i++) {
|
||||||
|
__disabledControlArray[i].disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_SimulateClick(element, event) {
|
||||||
|
var clickEvent;
|
||||||
|
if (element) {
|
||||||
|
if (element.click) {
|
||||||
|
element.click();
|
||||||
|
} else {
|
||||||
|
clickEvent = document.createEvent("MouseEvents");
|
||||||
|
clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
||||||
|
if (!element.dispatchEvent(clickEvent)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) {
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_FireDefaultButton(event, target) {
|
||||||
|
if (event.keyCode == 13) {
|
||||||
|
var src = event.srcElement || event.target;
|
||||||
|
if (src &&
|
||||||
|
((src.tagName.toLowerCase() == "input") &&
|
||||||
|
(src.type.toLowerCase() == "submit" || src.type.toLowerCase() == "button")) ||
|
||||||
|
((src.tagName.toLowerCase() == "a") &&
|
||||||
|
(src.href != null) && (src.href != "")) ||
|
||||||
|
(src.tagName.toLowerCase() == "textarea")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var defaultButton;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
defaultButton = document.getElementById(target);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
defaultButton = document.all[target];
|
||||||
|
}
|
||||||
|
if (defaultButton) {
|
||||||
|
return WebForm_SimulateClick(defaultButton, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_GetScrollX() {
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
return window.pageXOffset;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (document.documentElement && document.documentElement.scrollLeft) {
|
||||||
|
return document.documentElement.scrollLeft;
|
||||||
|
}
|
||||||
|
else if (document.body) {
|
||||||
|
return document.body.scrollLeft;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
function WebForm_GetScrollY() {
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
return window.pageYOffset;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (document.documentElement && document.documentElement.scrollTop) {
|
||||||
|
return document.documentElement.scrollTop;
|
||||||
|
}
|
||||||
|
else if (document.body) {
|
||||||
|
return document.body.scrollTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
function WebForm_SaveScrollPositionSubmit() {
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;
|
||||||
|
theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();
|
||||||
|
theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();
|
||||||
|
}
|
||||||
|
if ((typeof(this.oldSubmit) != "undefined") && (this.oldSubmit != null)) {
|
||||||
|
return this.oldSubmit();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_SaveScrollPositionOnSubmit() {
|
||||||
|
theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();
|
||||||
|
theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();
|
||||||
|
if ((typeof(this.oldOnSubmit) != "undefined") && (this.oldOnSubmit != null)) {
|
||||||
|
return this.oldOnSubmit();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_RestoreScrollPosition() {
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);
|
||||||
|
}
|
||||||
|
if ((typeof(theForm.oldOnLoad) != "undefined") && (theForm.oldOnLoad != null)) {
|
||||||
|
return theForm.oldOnLoad();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_TextBoxKeyHandler(event) {
|
||||||
|
if (event.keyCode == 13) {
|
||||||
|
var target;
|
||||||
|
if (__nonMSDOMBrowser) {
|
||||||
|
target = event.target;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
target = event.srcElement;
|
||||||
|
}
|
||||||
|
if ((typeof(target) != "undefined") && (target != null)) {
|
||||||
|
if (typeof(target.onchange) != "undefined") {
|
||||||
|
target.onchange();
|
||||||
|
event.cancelBubble = true;
|
||||||
|
if (event.stopPropagation) event.stopPropagation();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebForm_TrimString(value) {
|
||||||
|
return value.replace(/^\s+|\s+$/g, '')
|
||||||
|
}
|
||||||
|
function WebForm_AppendToClassName(element, className) {
|
||||||
|
var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';
|
||||||
|
className = WebForm_TrimString(className);
|
||||||
|
var index = currentClassName.indexOf(' ' + className + ' ');
|
||||||
|
if (index === -1) {
|
||||||
|
element.className = (element.className === '') ? className : element.className + ' ' + className;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_RemoveClassName(element, className) {
|
||||||
|
var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';
|
||||||
|
className = WebForm_TrimString(className);
|
||||||
|
var index = currentClassName.indexOf(' ' + className + ' ');
|
||||||
|
if (index >= 0) {
|
||||||
|
element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +
|
||||||
|
currentClassName.substring(index + className.length + 1, currentClassName.length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_GetElementById(elementId) {
|
||||||
|
if (document.getElementById) {
|
||||||
|
return document.getElementById(elementId);
|
||||||
|
}
|
||||||
|
else if (document.all) {
|
||||||
|
return document.all[elementId];
|
||||||
|
}
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
function WebForm_GetElementByTagName(element, tagName) {
|
||||||
|
var elements = WebForm_GetElementsByTagName(element, tagName);
|
||||||
|
if (elements && elements.length > 0) {
|
||||||
|
return elements[0];
|
||||||
|
}
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
function WebForm_GetElementsByTagName(element, tagName) {
|
||||||
|
if (element && tagName) {
|
||||||
|
if (element.getElementsByTagName) {
|
||||||
|
return element.getElementsByTagName(tagName);
|
||||||
|
}
|
||||||
|
if (element.all && element.all.tags) {
|
||||||
|
return element.all.tags(tagName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
function WebForm_GetElementDir(element) {
|
||||||
|
if (element) {
|
||||||
|
if (element.dir) {
|
||||||
|
return element.dir;
|
||||||
|
}
|
||||||
|
return WebForm_GetElementDir(element.parentNode);
|
||||||
|
}
|
||||||
|
return "ltr";
|
||||||
|
}
|
||||||
|
function WebForm_GetElementPosition(element) {
|
||||||
|
var result = new Object();
|
||||||
|
result.x = 0;
|
||||||
|
result.y = 0;
|
||||||
|
result.width = 0;
|
||||||
|
result.height = 0;
|
||||||
|
if (element.offsetParent) {
|
||||||
|
result.x = element.offsetLeft;
|
||||||
|
result.y = element.offsetTop;
|
||||||
|
var parent = element.offsetParent;
|
||||||
|
while (parent) {
|
||||||
|
result.x += parent.offsetLeft;
|
||||||
|
result.y += parent.offsetTop;
|
||||||
|
var parentTagName = parent.tagName.toLowerCase();
|
||||||
|
if (parentTagName != "table" &&
|
||||||
|
parentTagName != "body" &&
|
||||||
|
parentTagName != "html" &&
|
||||||
|
parentTagName != "div" &&
|
||||||
|
parent.clientTop &&
|
||||||
|
parent.clientLeft) {
|
||||||
|
result.x += parent.clientLeft;
|
||||||
|
result.y += parent.clientTop;
|
||||||
|
}
|
||||||
|
parent = parent.offsetParent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (element.left && element.top) {
|
||||||
|
result.x = element.left;
|
||||||
|
result.y = element.top;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (element.x) {
|
||||||
|
result.x = element.x;
|
||||||
|
}
|
||||||
|
if (element.y) {
|
||||||
|
result.y = element.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (element.offsetWidth && element.offsetHeight) {
|
||||||
|
result.width = element.offsetWidth;
|
||||||
|
result.height = element.offsetHeight;
|
||||||
|
}
|
||||||
|
else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {
|
||||||
|
result.width = element.style.pixelWidth;
|
||||||
|
result.height = element.style.pixelHeight;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function WebForm_GetParentByTagName(element, tagName) {
|
||||||
|
var parent = element.parentNode;
|
||||||
|
var upperTagName = tagName.toUpperCase();
|
||||||
|
while (parent && (parent.tagName.toUpperCase() != upperTagName)) {
|
||||||
|
parent = parent.parentNode ? parent.parentNode : parent.parentElement;
|
||||||
|
}
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
function WebForm_SetElementHeight(element, height) {
|
||||||
|
if (element && element.style) {
|
||||||
|
element.style.height = height + "px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_SetElementWidth(element, width) {
|
||||||
|
if (element && element.style) {
|
||||||
|
element.style.width = width + "px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_SetElementX(element, x) {
|
||||||
|
if (element && element.style) {
|
||||||
|
element.style.left = x + "px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebForm_SetElementY(element, y) {
|
||||||
|
if (element && element.style) {
|
||||||
|
element.style.top = y + "px";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,647 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js
|
||||||
|
var __wpm = null;
|
||||||
|
function Point(x, y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
function __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {
|
||||||
|
while ((typeof(offsetElement) != "undefined") && (offsetElement != null) && (offsetElement != relativeToElement)) {
|
||||||
|
x += offsetElement.offsetLeft;
|
||||||
|
y += offsetElement.offsetTop;
|
||||||
|
var tagName = offsetElement.tagName;
|
||||||
|
if ((tagName != "TABLE") && (tagName != "BODY")) {
|
||||||
|
x += offsetElement.clientLeft;
|
||||||
|
y += offsetElement.clientTop;
|
||||||
|
}
|
||||||
|
if (includeScroll && (tagName != "BODY")) {
|
||||||
|
x -= offsetElement.scrollLeft;
|
||||||
|
y -= offsetElement.scrollTop;
|
||||||
|
}
|
||||||
|
offsetElement = offsetElement.offsetParent;
|
||||||
|
}
|
||||||
|
return new Point(x, y);
|
||||||
|
}
|
||||||
|
function __wpGetPageEventLocation(event, includeScroll) {
|
||||||
|
if ((typeof(event) == "undefined") || (event == null)) {
|
||||||
|
event = window.event;
|
||||||
|
}
|
||||||
|
return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);
|
||||||
|
}
|
||||||
|
function __wpClearSelection() {
|
||||||
|
document.selection.empty();
|
||||||
|
}
|
||||||
|
function WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {
|
||||||
|
this.webPartElement = webPartElement;
|
||||||
|
this.allowZoneChange = allowZoneChange;
|
||||||
|
this.zone = zone;
|
||||||
|
this.zoneIndex = zoneIndex;
|
||||||
|
this.title = ((typeof(webPartTitleElement) != "undefined") && (webPartTitleElement != null)) ?
|
||||||
|
webPartTitleElement.innerText : "";
|
||||||
|
webPartElement.__webPart = this;
|
||||||
|
if ((typeof(webPartTitleElement) != "undefined") && (webPartTitleElement != null)) {
|
||||||
|
webPartTitleElement.style.cursor = "move";
|
||||||
|
webPartTitleElement.attachEvent("onmousedown", WebPart_OnMouseDown);
|
||||||
|
webPartElement.attachEvent("ondragstart", WebPart_OnDragStart);
|
||||||
|
webPartElement.attachEvent("ondrag", WebPart_OnDrag);
|
||||||
|
webPartElement.attachEvent("ondragend", WebPart_OnDragEnd);
|
||||||
|
}
|
||||||
|
this.UpdatePosition = WebPart_UpdatePosition;
|
||||||
|
this.Dispose = WebPart_Dispose;
|
||||||
|
}
|
||||||
|
function WebPart_Dispose() {
|
||||||
|
this.webPartElement.__webPart = null
|
||||||
|
}
|
||||||
|
function WebPart_OnMouseDown() {
|
||||||
|
var currentEvent = window.event;
|
||||||
|
var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);
|
||||||
|
if ((typeof(draggedWebPart) == "undefined") || (draggedWebPart == null)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
document.selection.empty();
|
||||||
|
try {
|
||||||
|
__wpm.draggedWebPart = draggedWebPart;
|
||||||
|
__wpm.DragDrop();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
__wpm.draggedWebPart = draggedWebPart;
|
||||||
|
window.setTimeout("__wpm.DragDrop()", 0);
|
||||||
|
}
|
||||||
|
currentEvent.returnValue = false;
|
||||||
|
currentEvent.cancelBubble = true;
|
||||||
|
}
|
||||||
|
function WebPart_OnDragStart() {
|
||||||
|
var currentEvent = window.event;
|
||||||
|
var webPartElement = currentEvent.srcElement;
|
||||||
|
if ((typeof(webPartElement.__webPart) == "undefined") || (webPartElement.__webPart == null)) {
|
||||||
|
currentEvent.returnValue = false;
|
||||||
|
currentEvent.cancelBubble = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var dataObject = currentEvent.dataTransfer;
|
||||||
|
dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);
|
||||||
|
}
|
||||||
|
function WebPart_OnDrag() {
|
||||||
|
__wpm.ContinueWebPartDragDrop();
|
||||||
|
}
|
||||||
|
function WebPart_OnDragEnd() {
|
||||||
|
__wpm.CompleteWebPartDragDrop();
|
||||||
|
}
|
||||||
|
function WebPart_GetParentWebPartElement(containedElement) {
|
||||||
|
var elem = containedElement;
|
||||||
|
while ((typeof(elem.__webPart) == "undefined") || (elem.__webPart == null)) {
|
||||||
|
elem = elem.parentElement;
|
||||||
|
if ((typeof(elem) == "undefined") || (elem == null)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
function WebPart_UpdatePosition() {
|
||||||
|
var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);
|
||||||
|
this.middleX = location.x + this.webPartElement.offsetWidth / 2;
|
||||||
|
this.middleY = location.y + this.webPartElement.offsetHeight / 2;
|
||||||
|
}
|
||||||
|
function Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {
|
||||||
|
var webPartTable = null;
|
||||||
|
if (zoneElement.rows.length == 1) {
|
||||||
|
webPartTableContainer = zoneElement.rows[0].cells[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
webPartTableContainer = zoneElement.rows[1].cells[0];
|
||||||
|
}
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < webPartTableContainer.childNodes.length; i++) {
|
||||||
|
var node = webPartTableContainer.childNodes[i];
|
||||||
|
if (node.tagName == "TABLE") {
|
||||||
|
webPartTable = node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.zoneElement = zoneElement;
|
||||||
|
this.zoneIndex = zoneIndex;
|
||||||
|
this.webParts = new Array();
|
||||||
|
this.uniqueID = uniqueID;
|
||||||
|
this.isVertical = isVertical;
|
||||||
|
this.allowLayoutChange = allowLayoutChange;
|
||||||
|
this.allowDrop = false;
|
||||||
|
this.webPartTable = webPartTable;
|
||||||
|
this.highlightColor = highlightColor;
|
||||||
|
this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;
|
||||||
|
this.dropCueElements = new Array();
|
||||||
|
if (webPartTable != null) {
|
||||||
|
if (isVertical) {
|
||||||
|
for (i = 0; i < webPartTable.rows.length; i += 2) {
|
||||||
|
this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {
|
||||||
|
this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.AddWebPart = Zone_AddWebPart;
|
||||||
|
this.GetWebPartIndex = Zone_GetWebPartIndex;
|
||||||
|
this.ToggleDropCues = Zone_ToggleDropCues;
|
||||||
|
this.UpdatePosition = Zone_UpdatePosition;
|
||||||
|
this.Dispose = Zone_Dispose;
|
||||||
|
webPartTable.__zone = this;
|
||||||
|
webPartTable.attachEvent("ondragenter", Zone_OnDragEnter);
|
||||||
|
webPartTable.attachEvent("ondrop", Zone_OnDrop);
|
||||||
|
}
|
||||||
|
function Zone_Dispose() {
|
||||||
|
for (var i = 0; i < this.webParts.length; i++) {
|
||||||
|
this.webParts[i].Dispose();
|
||||||
|
}
|
||||||
|
this.webPartTable.__zone = null;
|
||||||
|
}
|
||||||
|
function Zone_OnDragEnter() {
|
||||||
|
var handled = __wpm.ProcessWebPartDragEnter();
|
||||||
|
var currentEvent = window.event;
|
||||||
|
if (handled) {
|
||||||
|
currentEvent.returnValue = false;
|
||||||
|
currentEvent.cancelBubble = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Zone_OnDragOver() {
|
||||||
|
var handled = __wpm.ProcessWebPartDragOver();
|
||||||
|
var currentEvent = window.event;
|
||||||
|
if (handled) {
|
||||||
|
currentEvent.returnValue = false;
|
||||||
|
currentEvent.cancelBubble = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Zone_OnDrop() {
|
||||||
|
var handled = __wpm.ProcessWebPartDrop();
|
||||||
|
var currentEvent = window.event;
|
||||||
|
if (handled) {
|
||||||
|
currentEvent.returnValue = false;
|
||||||
|
currentEvent.cancelBubble = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Zone_GetParentZoneElement(containedElement) {
|
||||||
|
var elem = containedElement;
|
||||||
|
while ((typeof(elem.__zone) == "undefined") || (elem.__zone == null)) {
|
||||||
|
elem = elem.parentElement;
|
||||||
|
if ((typeof(elem) == "undefined") || (elem == null)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
function Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {
|
||||||
|
var webPart = null;
|
||||||
|
var zoneIndex = this.webParts.length;
|
||||||
|
if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {
|
||||||
|
webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);
|
||||||
|
}
|
||||||
|
this.webParts[zoneIndex] = webPart;
|
||||||
|
return webPart;
|
||||||
|
}
|
||||||
|
function Zone_ToggleDropCues(show, index, ignoreOutline) {
|
||||||
|
if (ignoreOutline == false) {
|
||||||
|
this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);
|
||||||
|
}
|
||||||
|
if (index == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var dropCue = this.dropCueElements[index];
|
||||||
|
if (dropCue && dropCue.style) {
|
||||||
|
if (dropCue.style.height == "100%" && !dropCue.webPartZoneHorizontalCueResized) {
|
||||||
|
var oldParentHeight = dropCue.parentElement.clientHeight;
|
||||||
|
var realHeight = oldParentHeight - 10;
|
||||||
|
dropCue.style.height = realHeight + "px";
|
||||||
|
var dropCueVerticalBar = dropCue.getElementsByTagName("DIV")[0];
|
||||||
|
if (dropCueVerticalBar && dropCueVerticalBar.style) {
|
||||||
|
dropCueVerticalBar.style.height = dropCue.style.height;
|
||||||
|
var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);
|
||||||
|
if (heightDiff) {
|
||||||
|
dropCue.style.height = (realHeight - heightDiff) + "px";
|
||||||
|
dropCueVerticalBar.style.height = dropCue.style.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dropCue.webPartZoneHorizontalCueResized = true;
|
||||||
|
}
|
||||||
|
dropCue.style.visibility = (show ? "visible" : "hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function Zone_GetWebPartIndex(location) {
|
||||||
|
var x = location.x;
|
||||||
|
var y = location.y;
|
||||||
|
if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||
|
||||||
|
(y < this.webPartTableTop) || (y > this.webPartTableBottom)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
var vertical = this.isVertical;
|
||||||
|
var webParts = this.webParts;
|
||||||
|
var webPartsCount = webParts.length;
|
||||||
|
for (var i = 0; i < webPartsCount; i++) {
|
||||||
|
var webPart = webParts[i];
|
||||||
|
if (vertical) {
|
||||||
|
if (y < webPart.middleY) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (x < webPart.middleX) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return webPartsCount;
|
||||||
|
}
|
||||||
|
function Zone_UpdatePosition() {
|
||||||
|
var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);
|
||||||
|
this.webPartTableLeft = topLeft.x;
|
||||||
|
this.webPartTableTop = topLeft.y;
|
||||||
|
this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;
|
||||||
|
this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;
|
||||||
|
for (var i = 0; i < this.webParts.length; i++) {
|
||||||
|
this.webParts[i].UpdatePosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartDragState(webPartElement, effect) {
|
||||||
|
this.webPartElement = webPartElement;
|
||||||
|
this.dropZoneElement = null;
|
||||||
|
this.dropIndex = -1;
|
||||||
|
this.effect = effect;
|
||||||
|
this.dropped = false;
|
||||||
|
}
|
||||||
|
function WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {
|
||||||
|
this.menuLabelElement = menuLabelElement;
|
||||||
|
this.menuDropDownElement = menuDropDownElement;
|
||||||
|
this.menuElement = menuElement;
|
||||||
|
this.menuLabelElement.__menu = this;
|
||||||
|
this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);
|
||||||
|
this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);
|
||||||
|
this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);
|
||||||
|
this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);
|
||||||
|
if ((typeof(this.menuDropDownElement) != "undefined") && (this.menuDropDownElement != null)) {
|
||||||
|
this.menuDropDownElement.__menu = this;
|
||||||
|
}
|
||||||
|
this.menuItemStyle = "";
|
||||||
|
this.menuItemHoverStyle = "";
|
||||||
|
this.popup = null;
|
||||||
|
this.hoverClassName = "";
|
||||||
|
this.hoverColor = "";
|
||||||
|
this.oldColor = this.menuLabelElement.style.color;
|
||||||
|
this.oldTextDecoration = this.menuLabelElement.style.textDecoration;
|
||||||
|
this.oldClassName = this.menuLabelElement.className;
|
||||||
|
this.Show = WebPartMenu_Show;
|
||||||
|
this.Hide = WebPartMenu_Hide;
|
||||||
|
this.Hover = WebPartMenu_Hover;
|
||||||
|
this.Unhover = WebPartMenu_Unhover;
|
||||||
|
this.Dispose = WebPartMenu_Dispose;
|
||||||
|
var menu = this;
|
||||||
|
this.disposeDelegate = function() { menu.Dispose(); };
|
||||||
|
window.attachEvent('onunload', this.disposeDelegate);
|
||||||
|
}
|
||||||
|
function WebPartMenu_Dispose() {
|
||||||
|
this.menuLabelElement.__menu = null;
|
||||||
|
this.menuDropDownElement.__menu = null;
|
||||||
|
window.detachEvent('onunload', this.disposeDelegate);
|
||||||
|
}
|
||||||
|
function WebPartMenu_Show() {
|
||||||
|
if ((typeof(__wpm.menu) != "undefined") && (__wpm.menu != null)) {
|
||||||
|
__wpm.menu.Hide();
|
||||||
|
}
|
||||||
|
var menuHTML =
|
||||||
|
"<html><head><style>" +
|
||||||
|
"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; " + this.itemStyle + " }" +
|
||||||
|
"a.menuItem:Hover { " + this.itemHoverStyle + " }" +
|
||||||
|
"</style><body scroll=\"no\" style=\"border: none; margin: 0; padding: 0;\" ondragstart=\"window.event.returnValue=false;\" onclick=\"popup.hide()\">" +
|
||||||
|
this.menuElement.innerHTML +
|
||||||
|
"</body></html>";
|
||||||
|
var width = 16;
|
||||||
|
var height = 16;
|
||||||
|
this.popup = window.createPopup();
|
||||||
|
__wpm.menu = this;
|
||||||
|
var popupDocument = this.popup.document;
|
||||||
|
popupDocument.write(menuHTML);
|
||||||
|
this.popup.show(0, 0, width, height);
|
||||||
|
var popupBody = popupDocument.body;
|
||||||
|
width = popupBody.scrollWidth;
|
||||||
|
height = popupBody.scrollHeight;
|
||||||
|
if (width < this.menuLabelElement.offsetWidth) {
|
||||||
|
width = this.menuLabelElement.offsetWidth + 16;
|
||||||
|
}
|
||||||
|
if (this.menuElement.innerHTML.indexOf("progid:DXImageTransform.Microsoft.Shadow") != -1) {
|
||||||
|
popupBody.style.paddingRight = "4px";
|
||||||
|
}
|
||||||
|
popupBody.__wpm = __wpm;
|
||||||
|
popupBody.__wpmDeleteWarning = __wpmDeleteWarning;
|
||||||
|
popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;
|
||||||
|
popupBody.popup = this.popup;
|
||||||
|
this.popup.hide();
|
||||||
|
this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);
|
||||||
|
}
|
||||||
|
function WebPartMenu_Hide() {
|
||||||
|
if (__wpm.menu == this) {
|
||||||
|
__wpm.menu = null;
|
||||||
|
if ((typeof(this.popup) != "undefined") && (this.popup != null)) {
|
||||||
|
this.popup.hide();
|
||||||
|
this.popup = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_Hover() {
|
||||||
|
if (this.labelHoverClassName != "") {
|
||||||
|
this.menuLabelElement.className = this.menuLabelElement.className + " " + this.labelHoverClassName;
|
||||||
|
}
|
||||||
|
if (this.labelHoverColor != "") {
|
||||||
|
this.menuLabelElement.style.color = this.labelHoverColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_Unhover() {
|
||||||
|
if (this.labelHoverClassName != "") {
|
||||||
|
this.menuLabelElement.style.textDecoration = this.oldTextDecoration;
|
||||||
|
this.menuLabelElement.className = this.oldClassName;
|
||||||
|
}
|
||||||
|
if (this.labelHoverColor != "") {
|
||||||
|
this.menuLabelElement.style.color = this.oldColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_OnClick() {
|
||||||
|
var menu = window.event.srcElement.__menu;
|
||||||
|
if ((typeof(menu) != "undefined") && (menu != null)) {
|
||||||
|
window.event.returnValue = false;
|
||||||
|
window.event.cancelBubble = true;
|
||||||
|
menu.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_OnKeyPress() {
|
||||||
|
if (window.event.keyCode == 13) {
|
||||||
|
var menu = window.event.srcElement.__menu;
|
||||||
|
if ((typeof(menu) != "undefined") && (menu != null)) {
|
||||||
|
window.event.returnValue = false;
|
||||||
|
window.event.cancelBubble = true;
|
||||||
|
menu.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_OnMouseEnter() {
|
||||||
|
var menu = window.event.srcElement.__menu;
|
||||||
|
if ((typeof(menu) != "undefined") && (menu != null)) {
|
||||||
|
menu.Hover();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartMenu_OnMouseLeave() {
|
||||||
|
var menu = window.event.srcElement.__menu;
|
||||||
|
if ((typeof(menu) != "undefined") && (menu != null)) {
|
||||||
|
menu.Unhover();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager() {
|
||||||
|
this.overlayContainerElement = null;
|
||||||
|
this.zones = new Array();
|
||||||
|
this.dragState = null;
|
||||||
|
this.menu = null;
|
||||||
|
this.draggedWebPart = null;
|
||||||
|
this.AddZone = WebPartManager_AddZone;
|
||||||
|
this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;
|
||||||
|
this.DragDrop = WebPartManager_DragDrop;
|
||||||
|
this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;
|
||||||
|
this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;
|
||||||
|
this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;
|
||||||
|
this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;
|
||||||
|
this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;
|
||||||
|
this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;
|
||||||
|
this.ShowHelp = WebPartManager_ShowHelp;
|
||||||
|
this.ExportWebPart = WebPartManager_ExportWebPart;
|
||||||
|
this.Execute = WebPartManager_Execute;
|
||||||
|
this.SubmitPage = WebPartManager_SubmitPage;
|
||||||
|
this.UpdatePositions = WebPartManager_UpdatePositions;
|
||||||
|
window.attachEvent("onunload", WebPartManager_Dispose);
|
||||||
|
}
|
||||||
|
function WebPartManager_Dispose() {
|
||||||
|
for (var i = 0; i < __wpm.zones.length; i++) {
|
||||||
|
__wpm.zones[i].Dispose();
|
||||||
|
}
|
||||||
|
window.detachEvent("onunload", WebPartManager_Dispose);
|
||||||
|
}
|
||||||
|
function WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {
|
||||||
|
var zoneIndex = this.zones.length;
|
||||||
|
var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);
|
||||||
|
this.zones[zoneIndex] = zone;
|
||||||
|
return zone;
|
||||||
|
}
|
||||||
|
function WebPartManager_IsDragDropEnabled() {
|
||||||
|
return ((typeof(this.overlayContainerElement) != "undefined") && (this.overlayContainerElement != null));
|
||||||
|
}
|
||||||
|
function WebPartManager_DragDrop() {
|
||||||
|
if ((typeof(this.draggedWebPart) != "undefined") && (this.draggedWebPart != null)) {
|
||||||
|
var tempWebPart = this.draggedWebPart;
|
||||||
|
this.draggedWebPart = null;
|
||||||
|
tempWebPart.dragDrop();
|
||||||
|
window.setTimeout("__wpClearSelection()", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager_InitiateWebPartDragDrop(webPartElement) {
|
||||||
|
var webPart = webPartElement.__webPart;
|
||||||
|
this.UpdatePositions();
|
||||||
|
this.dragState = new WebPartDragState(webPartElement, "move");
|
||||||
|
var location = __wpGetPageEventLocation(window.event, true);
|
||||||
|
var overlayContainerElement = this.overlayContainerElement;
|
||||||
|
overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;
|
||||||
|
overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);
|
||||||
|
overlayContainerElement.style.display = "block";
|
||||||
|
overlayContainerElement.style.width = webPartElement.offsetWidth;
|
||||||
|
overlayContainerElement.style.height = webPartElement.offsetHeight;
|
||||||
|
overlayContainerElement.appendChild(webPartElement.cloneNode(true));
|
||||||
|
if (webPart.allowZoneChange == false) {
|
||||||
|
webPart.zone.allowDrop = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (var i = 0; i < __wpm.zones.length; i++) {
|
||||||
|
var zone = __wpm.zones[i];
|
||||||
|
if (zone.allowLayoutChange) {
|
||||||
|
zone.allowDrop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
document.body.attachEvent("ondragover", Zone_OnDragOver);
|
||||||
|
return "move";
|
||||||
|
}
|
||||||
|
function WebPartManager_CompleteWebPartDragDrop() {
|
||||||
|
var dragState = this.dragState;
|
||||||
|
this.dragState = null;
|
||||||
|
if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);
|
||||||
|
}
|
||||||
|
document.body.detachEvent("ondragover", Zone_OnDragOver);
|
||||||
|
for (var i = 0; i < __wpm.zones.length; i++) {
|
||||||
|
__wpm.zones[i].allowDrop = false;
|
||||||
|
}
|
||||||
|
this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);
|
||||||
|
this.overlayContainerElement.style.display = "none";
|
||||||
|
if ((typeof(dragState) != "undefined") && (dragState != null) && (dragState.dropped == true)) {
|
||||||
|
var currentZone = dragState.webPartElement.__webPart.zone;
|
||||||
|
var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;
|
||||||
|
if ((currentZone != dragState.dropZoneElement.__zone) ||
|
||||||
|
((currentZoneIndex != dragState.dropIndex) &&
|
||||||
|
(currentZoneIndex != (dragState.dropIndex - 1)))) {
|
||||||
|
var eventTarget = dragState.dropZoneElement.__zone.uniqueID;
|
||||||
|
var eventArgument = "Drag:" + dragState.webPartElement.id + ":" + dragState.dropIndex;
|
||||||
|
this.SubmitPage(eventTarget, eventArgument);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager_ContinueWebPartDragDrop() {
|
||||||
|
var dragState = this.dragState;
|
||||||
|
if ((typeof(dragState) != "undefined") && (dragState != null)) {
|
||||||
|
var style = this.overlayContainerElement.style;
|
||||||
|
var location = __wpGetPageEventLocation(window.event, true);
|
||||||
|
style.left = location.x - dragState.webPartElement.offsetWidth / 2;
|
||||||
|
style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager_Execute(script) {
|
||||||
|
if (this.menu) {
|
||||||
|
this.menu.Hide();
|
||||||
|
}
|
||||||
|
var scriptReference = new Function(script);
|
||||||
|
return (scriptReference() != false);
|
||||||
|
}
|
||||||
|
function WebPartManager_ProcessWebPartDragEnter() {
|
||||||
|
var dragState = __wpm.dragState;
|
||||||
|
if ((typeof(dragState) != "undefined") && (dragState != null)) {
|
||||||
|
var currentEvent = window.event;
|
||||||
|
var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);
|
||||||
|
if ((typeof(newDropZoneElement.__zone) == "undefined") || (newDropZoneElement.__zone == null) ||
|
||||||
|
(newDropZoneElement.__zone.allowDrop == false)) {
|
||||||
|
newDropZoneElement = null;
|
||||||
|
}
|
||||||
|
var newDropIndex = -1;
|
||||||
|
if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) {
|
||||||
|
newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));
|
||||||
|
if (newDropIndex == -1) {
|
||||||
|
newDropZoneElement = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dragState.dropZoneElement != newDropZoneElement) {
|
||||||
|
if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);
|
||||||
|
}
|
||||||
|
dragState.dropZoneElement = newDropZoneElement;
|
||||||
|
dragState.dropIndex = newDropIndex;
|
||||||
|
if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) {
|
||||||
|
newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (dragState.dropIndex != newDropIndex) {
|
||||||
|
if (dragState.dropIndex != -1) {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);
|
||||||
|
}
|
||||||
|
dragState.dropIndex = newDropIndex;
|
||||||
|
if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) {
|
||||||
|
newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) {
|
||||||
|
currentEvent.dataTransfer.effectAllowed = dragState.effect;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function WebPartManager_ProcessWebPartDragOver() {
|
||||||
|
var dragState = __wpm.dragState;
|
||||||
|
var currentEvent = window.event;
|
||||||
|
var handled = false;
|
||||||
|
if ((typeof(dragState) != "undefined") && (dragState != null) &&
|
||||||
|
(typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) {
|
||||||
|
var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);
|
||||||
|
if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {
|
||||||
|
dropZoneElement = null;
|
||||||
|
}
|
||||||
|
if (((typeof(dropZoneElement) == "undefined") || (dropZoneElement == null)) &&
|
||||||
|
(typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);
|
||||||
|
dragState.dropZoneElement = null;
|
||||||
|
dragState.dropIndex = -1;
|
||||||
|
}
|
||||||
|
else if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null)) {
|
||||||
|
var location = __wpGetPageEventLocation(currentEvent, false);
|
||||||
|
var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);
|
||||||
|
if (newDropIndex == -1) {
|
||||||
|
dropZoneElement = null;
|
||||||
|
}
|
||||||
|
if (dragState.dropZoneElement != dropZoneElement) {
|
||||||
|
if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == "undefined") || (dropZoneElement == null)) {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);
|
||||||
|
}
|
||||||
|
dragState.dropZoneElement = dropZoneElement;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);
|
||||||
|
}
|
||||||
|
dragState.dropIndex = newDropIndex;
|
||||||
|
if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null)) {
|
||||||
|
dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if ((typeof(dragState) == "undefined") || (dragState == null) ||
|
||||||
|
(typeof(dragState.dropZoneElement) == "undefined") || (dragState.dropZoneElement == null)) {
|
||||||
|
currentEvent.dataTransfer.effectAllowed = "none";
|
||||||
|
}
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
function WebPartManager_ProcessWebPartDrop() {
|
||||||
|
var dragState = this.dragState;
|
||||||
|
if ((typeof(dragState) != "undefined") && (dragState != null)) {
|
||||||
|
var currentEvent = window.event;
|
||||||
|
var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);
|
||||||
|
if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {
|
||||||
|
dropZoneElement = null;
|
||||||
|
}
|
||||||
|
if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {
|
||||||
|
dragState.dropped = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function WebPartManager_ShowHelp(helpUrl, helpMode) {
|
||||||
|
if ((typeof(this.menu) != "undefined") && (this.menu != null)) {
|
||||||
|
this.menu.Hide();
|
||||||
|
}
|
||||||
|
if (helpMode == 0 || helpMode == 1) {
|
||||||
|
if (helpMode == 0) {
|
||||||
|
var dialogInfo = "edge: Sunken; center: yes; help: no; resizable: yes; status: no";
|
||||||
|
window.showModalDialog(helpUrl, null, dialogInfo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
window.open(helpUrl, null, "scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (helpMode == 2) {
|
||||||
|
window.location = helpUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {
|
||||||
|
if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {
|
||||||
|
if (confirm(__wpmExportWarning) == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (confirmOnly == false) {
|
||||||
|
window.location = exportUrl;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function WebPartManager_UpdatePositions() {
|
||||||
|
for (var i = 0; i < this.zones.length; i++) {
|
||||||
|
this.zones[i].UpdatePosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function WebPartManager_SubmitPage(eventTarget, eventArgument) {
|
||||||
|
if ((typeof(this.menu) != "undefined") && (this.menu != null)) {
|
||||||
|
this.menu.Hide();
|
||||||
|
}
|
||||||
|
__doPostBack(eventTarget, eventArgument);
|
||||||
|
}
|
@ -0,0 +1,684 @@
|
|||||||
|
//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js
|
||||||
|
var Page_ValidationVer = "125";
|
||||||
|
var Page_IsValid = true;
|
||||||
|
var Page_BlockSubmit = false;
|
||||||
|
var Page_InvalidControlToBeFocused = null;
|
||||||
|
var Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;
|
||||||
|
function ValidatorUpdateDisplay(val) {
|
||||||
|
if (typeof(val.display) == "string") {
|
||||||
|
if (val.display == "None") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (val.display == "Dynamic") {
|
||||||
|
val.style.display = val.isvalid ? "none" : "inline";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((navigator.userAgent.indexOf("Mac") > -1) &&
|
||||||
|
(navigator.userAgent.indexOf("MSIE") > -1)) {
|
||||||
|
val.style.display = "inline";
|
||||||
|
}
|
||||||
|
val.style.visibility = val.isvalid ? "hidden" : "visible";
|
||||||
|
}
|
||||||
|
function ValidatorUpdateIsValid() {
|
||||||
|
Page_IsValid = AllValidatorsValid(Page_Validators);
|
||||||
|
}
|
||||||
|
function AllValidatorsValid(validators) {
|
||||||
|
if ((typeof(validators) != "undefined") && (validators != null)) {
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < validators.length; i++) {
|
||||||
|
if (!validators[i].isvalid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function ValidatorHookupControlID(controlID, val) {
|
||||||
|
if (typeof(controlID) != "string") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var ctrl = document.getElementById(controlID);
|
||||||
|
if ((typeof(ctrl) != "undefined") && (ctrl != null)) {
|
||||||
|
ValidatorHookupControl(ctrl, val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val.isvalid = true;
|
||||||
|
val.enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function ValidatorHookupControl(control, val) {
|
||||||
|
if (typeof(control.tagName) != "string") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") {
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < control.childNodes.length; i++) {
|
||||||
|
ValidatorHookupControl(control.childNodes[i], val);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (typeof(control.Validators) == "undefined") {
|
||||||
|
control.Validators = new Array;
|
||||||
|
var eventType;
|
||||||
|
if (control.type == "radio") {
|
||||||
|
eventType = "onclick";
|
||||||
|
} else {
|
||||||
|
eventType = "onchange";
|
||||||
|
if (typeof(val.focusOnError) == "string" && val.focusOnError == "t") {
|
||||||
|
ValidatorHookupEvent(control, "onblur", "ValidatedControlOnBlur(event); ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ValidatorHookupEvent(control, eventType, "ValidatorOnChange(event); ");
|
||||||
|
if (Page_TextTypes.test(control.type)) {
|
||||||
|
ValidatorHookupEvent(control, "onkeypress",
|
||||||
|
"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
control.Validators[control.Validators.length] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function ValidatorHookupEvent(control, eventType, functionPrefix) {
|
||||||
|
var ev = control[eventType];
|
||||||
|
if (typeof(ev) == "function") {
|
||||||
|
ev = ev.toString();
|
||||||
|
ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ev = "";
|
||||||
|
}
|
||||||
|
control[eventType] = new Function("event", functionPrefix + " " + ev);
|
||||||
|
}
|
||||||
|
function ValidatorGetValue(id) {
|
||||||
|
var control;
|
||||||
|
control = document.getElementById(id);
|
||||||
|
if (typeof(control.value) == "string") {
|
||||||
|
return control.value;
|
||||||
|
}
|
||||||
|
return ValidatorGetValueRecursive(control);
|
||||||
|
}
|
||||||
|
function ValidatorGetValueRecursive(control)
|
||||||
|
{
|
||||||
|
if (typeof(control.value) == "string" && (control.type != "radio" || control.checked == true)) {
|
||||||
|
return control.value;
|
||||||
|
}
|
||||||
|
var i, val;
|
||||||
|
for (i = 0; i<control.childNodes.length; i++) {
|
||||||
|
val = ValidatorGetValueRecursive(control.childNodes[i]);
|
||||||
|
if (val != "") return val;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
function Page_ClientValidate(validationGroup) {
|
||||||
|
Page_InvalidControlToBeFocused = null;
|
||||||
|
if (typeof(Page_Validators) == "undefined") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < Page_Validators.length; i++) {
|
||||||
|
ValidatorValidate(Page_Validators[i], validationGroup, null);
|
||||||
|
}
|
||||||
|
ValidatorUpdateIsValid();
|
||||||
|
ValidationSummaryOnSubmit(validationGroup);
|
||||||
|
Page_BlockSubmit = !Page_IsValid;
|
||||||
|
return Page_IsValid;
|
||||||
|
}
|
||||||
|
function ValidatorCommonOnSubmit() {
|
||||||
|
Page_InvalidControlToBeFocused = null;
|
||||||
|
var result = !Page_BlockSubmit;
|
||||||
|
if ((typeof(window.event) != "undefined") && (window.event != null)) {
|
||||||
|
window.event.returnValue = result;
|
||||||
|
}
|
||||||
|
Page_BlockSubmit = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function ValidatorEnable(val, enable) {
|
||||||
|
val.enabled = (enable != false);
|
||||||
|
ValidatorValidate(val);
|
||||||
|
ValidatorUpdateIsValid();
|
||||||
|
}
|
||||||
|
function ValidatorOnChange(event) {
|
||||||
|
event = event || window.event;
|
||||||
|
Page_InvalidControlToBeFocused = null;
|
||||||
|
var targetedControl;
|
||||||
|
if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
|
||||||
|
targetedControl = event.srcElement;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
targetedControl = event.target;
|
||||||
|
}
|
||||||
|
var vals;
|
||||||
|
if (typeof(targetedControl.Validators) != "undefined") {
|
||||||
|
vals = targetedControl.Validators;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (targetedControl.tagName.toLowerCase() == "label") {
|
||||||
|
targetedControl = document.getElementById(targetedControl.htmlFor);
|
||||||
|
vals = targetedControl.Validators;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vals) {
|
||||||
|
for (var i = 0; i < vals.length; i++) {
|
||||||
|
ValidatorValidate(vals[i], null, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ValidatorUpdateIsValid();
|
||||||
|
}
|
||||||
|
function ValidatedTextBoxOnKeyPress(event) {
|
||||||
|
event = event || window.event;
|
||||||
|
if (event.keyCode == 13) {
|
||||||
|
ValidatorOnChange(event);
|
||||||
|
var vals;
|
||||||
|
if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
|
||||||
|
vals = event.srcElement.Validators;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vals = event.target.Validators;
|
||||||
|
}
|
||||||
|
return AllValidatorsValid(vals);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function ValidatedControlOnBlur(event) {
|
||||||
|
event = event || window.event;
|
||||||
|
var control;
|
||||||
|
if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
|
||||||
|
control = event.srcElement;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
control = event.target;
|
||||||
|
}
|
||||||
|
if ((typeof(control) != "undefined") && (control != null) && (Page_InvalidControlToBeFocused == control)) {
|
||||||
|
control.focus();
|
||||||
|
Page_InvalidControlToBeFocused = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function ValidatorValidate(val, validationGroup, event) {
|
||||||
|
val.isvalid = true;
|
||||||
|
if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {
|
||||||
|
if (typeof(val.evaluationfunction) == "function") {
|
||||||
|
val.isvalid = val.evaluationfunction(val);
|
||||||
|
if (!val.isvalid && Page_InvalidControlToBeFocused == null &&
|
||||||
|
typeof(val.focusOnError) == "string" && val.focusOnError == "t") {
|
||||||
|
ValidatorSetFocus(val, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ValidatorUpdateDisplay(val);
|
||||||
|
}
|
||||||
|
function ValidatorSetFocus(val, event) {
|
||||||
|
var ctrl;
|
||||||
|
if (typeof(val.controlhookup) == "string") {
|
||||||
|
var eventCtrl;
|
||||||
|
if ((typeof(event) != "undefined") && (event != null)) {
|
||||||
|
if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
|
||||||
|
eventCtrl = event.srcElement;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eventCtrl = event.target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((typeof(eventCtrl) != "undefined") && (eventCtrl != null) &&
|
||||||
|
(typeof(eventCtrl.id) == "string") &&
|
||||||
|
(eventCtrl.id == val.controlhookup)) {
|
||||||
|
ctrl = eventCtrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((typeof(ctrl) == "undefined") || (ctrl == null)) {
|
||||||
|
ctrl = document.getElementById(val.controltovalidate);
|
||||||
|
}
|
||||||
|
if ((typeof(ctrl) != "undefined") && (ctrl != null) &&
|
||||||
|
(ctrl.tagName.toLowerCase() != "table" || (typeof(event) == "undefined") || (event == null)) &&
|
||||||
|
((ctrl.tagName.toLowerCase() != "input") || (ctrl.type.toLowerCase() != "hidden")) &&
|
||||||
|
(typeof(ctrl.disabled) == "undefined" || ctrl.disabled == null || ctrl.disabled == false) &&
|
||||||
|
(typeof(ctrl.visible) == "undefined" || ctrl.visible == null || ctrl.visible != false) &&
|
||||||
|
(IsInVisibleContainer(ctrl))) {
|
||||||
|
if ((ctrl.tagName.toLowerCase() == "table" && (typeof(__nonMSDOMBrowser) == "undefined" || __nonMSDOMBrowser)) ||
|
||||||
|
(ctrl.tagName.toLowerCase() == "span")) {
|
||||||
|
var inputElements = ctrl.getElementsByTagName("input");
|
||||||
|
var lastInputElement = inputElements[inputElements.length -1];
|
||||||
|
if (lastInputElement != null) {
|
||||||
|
ctrl = lastInputElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (typeof(ctrl.focus) != "undefined" && ctrl.focus != null) {
|
||||||
|
ctrl.focus();
|
||||||
|
Page_InvalidControlToBeFocused = ctrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function IsInVisibleContainer(ctrl) {
|
||||||
|
if (typeof(ctrl.style) != "undefined" &&
|
||||||
|
( ( typeof(ctrl.style.display) != "undefined" &&
|
||||||
|
ctrl.style.display == "none") ||
|
||||||
|
( typeof(ctrl.style.visibility) != "undefined" &&
|
||||||
|
ctrl.style.visibility == "hidden") ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (typeof(ctrl.parentNode) != "undefined" &&
|
||||||
|
ctrl.parentNode != null &&
|
||||||
|
ctrl.parentNode != ctrl) {
|
||||||
|
return IsInVisibleContainer(ctrl.parentNode);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function IsValidationGroupMatch(control, validationGroup) {
|
||||||
|
if ((typeof(validationGroup) == "undefined") || (validationGroup == null)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var controlGroup = "";
|
||||||
|
if (typeof(control.validationGroup) == "string") {
|
||||||
|
controlGroup = control.validationGroup;
|
||||||
|
}
|
||||||
|
return (controlGroup == validationGroup);
|
||||||
|
}
|
||||||
|
function ValidatorOnLoad() {
|
||||||
|
if (typeof(Page_Validators) == "undefined")
|
||||||
|
return;
|
||||||
|
var i, val;
|
||||||
|
for (i = 0; i < Page_Validators.length; i++) {
|
||||||
|
val = Page_Validators[i];
|
||||||
|
if (typeof(val.evaluationfunction) == "string") {
|
||||||
|
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
|
||||||
|
}
|
||||||
|
if (typeof(val.isvalid) == "string") {
|
||||||
|
if (val.isvalid == "False") {
|
||||||
|
val.isvalid = false;
|
||||||
|
Page_IsValid = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val.isvalid = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val.isvalid = true;
|
||||||
|
}
|
||||||
|
if (typeof(val.enabled) == "string") {
|
||||||
|
val.enabled = (val.enabled != "False");
|
||||||
|
}
|
||||||
|
if (typeof(val.controltovalidate) == "string") {
|
||||||
|
ValidatorHookupControlID(val.controltovalidate, val);
|
||||||
|
}
|
||||||
|
if (typeof(val.controlhookup) == "string") {
|
||||||
|
ValidatorHookupControlID(val.controlhookup, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Page_ValidationActive = true;
|
||||||
|
}
|
||||||
|
function ValidatorConvert(op, dataType, val) {
|
||||||
|
function GetFullYear(year) {
|
||||||
|
var twoDigitCutoffYear = val.cutoffyear % 100;
|
||||||
|
var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;
|
||||||
|
return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));
|
||||||
|
}
|
||||||
|
var num, cleanInput, m, exp;
|
||||||
|
if (dataType == "Integer") {
|
||||||
|
exp = /^\s*[-\+]?\d+\s*$/;
|
||||||
|
if (op.match(exp) == null)
|
||||||
|
return null;
|
||||||
|
num = parseInt(op, 10);
|
||||||
|
return (isNaN(num) ? null : num);
|
||||||
|
}
|
||||||
|
else if(dataType == "Double") {
|
||||||
|
exp = new RegExp("^\\s*([-\\+])?(\\d*)\\" + val.decimalchar + "?(\\d*)\\s*$");
|
||||||
|
m = op.match(exp);
|
||||||
|
if (m == null)
|
||||||
|
return null;
|
||||||
|
if (m[2].length == 0 && m[3].length == 0)
|
||||||
|
return null;
|
||||||
|
cleanInput = (m[1] != null ? m[1] : "") + (m[2].length>0 ? m[2] : "0") + (m[3].length>0 ? "." + m[3] : "");
|
||||||
|
num = parseFloat(cleanInput);
|
||||||
|
return (isNaN(num) ? null : num);
|
||||||
|
}
|
||||||
|
else if (dataType == "Currency") {
|
||||||
|
var hasDigits = (val.digits > 0);
|
||||||
|
var beginGroupSize, subsequentGroupSize;
|
||||||
|
var groupSizeNum = parseInt(val.groupsize, 10);
|
||||||
|
if (!isNaN(groupSizeNum) && groupSizeNum > 0) {
|
||||||
|
beginGroupSize = "{1," + groupSizeNum + "}";
|
||||||
|
subsequentGroupSize = "{" + groupSizeNum + "}";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
beginGroupSize = subsequentGroupSize = "+";
|
||||||
|
}
|
||||||
|
exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + val.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)"
|
||||||
|
+ (hasDigits ? "\\" + val.decimalchar + "?(\\d{0," + val.digits + "})" : "")
|
||||||
|
+ "\\s*$");
|
||||||
|
m = op.match(exp);
|
||||||
|
if (m == null)
|
||||||
|
return null;
|
||||||
|
if (m[2].length == 0 && hasDigits && m[5].length == 0)
|
||||||
|
return null;
|
||||||
|
cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : "");
|
||||||
|
num = parseFloat(cleanInput);
|
||||||
|
return (isNaN(num) ? null : num);
|
||||||
|
}
|
||||||
|
else if (dataType == "Date") {
|
||||||
|
var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$");
|
||||||
|
m = op.match(yearFirstExp);
|
||||||
|
var day, month, year;
|
||||||
|
if (m != null && (((typeof(m[2]) != "undefined") && (m[2].length == 4)) || val.dateorder == "ymd")) {
|
||||||
|
day = m[6];
|
||||||
|
month = m[5];
|
||||||
|
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (val.dateorder == "ymd"){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.|\\.)?\\s*$");
|
||||||
|
m = op.match(yearLastExp);
|
||||||
|
if (m == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (val.dateorder == "mdy") {
|
||||||
|
day = m[3];
|
||||||
|
month = m[1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
day = m[1];
|
||||||
|
month = m[3];
|
||||||
|
}
|
||||||
|
year = ((typeof(m[5]) != "undefined") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));
|
||||||
|
}
|
||||||
|
month -= 1;
|
||||||
|
var date = new Date(year, month, day);
|
||||||
|
if (year < 100) {
|
||||||
|
date.setFullYear(year);
|
||||||
|
}
|
||||||
|
return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return op.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function ValidatorCompare(operand1, operand2, operator, val) {
|
||||||
|
var dataType = val.type;
|
||||||
|
var op1, op2;
|
||||||
|
if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)
|
||||||
|
return false;
|
||||||
|
if (operator == "DataTypeCheck")
|
||||||
|
return true;
|
||||||
|
if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)
|
||||||
|
return true;
|
||||||
|
switch (operator) {
|
||||||
|
case "NotEqual":
|
||||||
|
return (op1 != op2);
|
||||||
|
case "GreaterThan":
|
||||||
|
return (op1 > op2);
|
||||||
|
case "GreaterThanEqual":
|
||||||
|
return (op1 >= op2);
|
||||||
|
case "LessThan":
|
||||||
|
return (op1 < op2);
|
||||||
|
case "LessThanEqual":
|
||||||
|
return (op1 <= op2);
|
||||||
|
default:
|
||||||
|
return (op1 == op2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function CompareValidatorEvaluateIsValid(val) {
|
||||||
|
var value = ValidatorGetValue(val.controltovalidate);
|
||||||
|
if (ValidatorTrim(value).length == 0)
|
||||||
|
return true;
|
||||||
|
var compareTo = "";
|
||||||
|
if ((typeof(val.controltocompare) != "string") ||
|
||||||
|
(typeof(document.getElementById(val.controltocompare)) == "undefined") ||
|
||||||
|
(null == document.getElementById(val.controltocompare))) {
|
||||||
|
if (typeof(val.valuetocompare) == "string") {
|
||||||
|
compareTo = val.valuetocompare;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
compareTo = ValidatorGetValue(val.controltocompare);
|
||||||
|
}
|
||||||
|
var operator = "Equal";
|
||||||
|
if (typeof(val.operator) == "string") {
|
||||||
|
operator = val.operator;
|
||||||
|
}
|
||||||
|
return ValidatorCompare(value, compareTo, operator, val);
|
||||||
|
}
|
||||||
|
function CustomValidatorEvaluateIsValid(val) {
|
||||||
|
var value = "";
|
||||||
|
if (typeof(val.controltovalidate) == "string") {
|
||||||
|
value = ValidatorGetValue(val.controltovalidate);
|
||||||
|
if ((ValidatorTrim(value).length == 0) &&
|
||||||
|
((typeof(val.validateemptytext) != "string") || (val.validateemptytext != "true"))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var args = { Value:value, IsValid:true };
|
||||||
|
if (typeof(val.clientvalidationfunction) == "string") {
|
||||||
|
eval(val.clientvalidationfunction + "(val, args) ;");
|
||||||
|
}
|
||||||
|
return args.IsValid;
|
||||||
|
}
|
||||||
|
function RegularExpressionValidatorEvaluateIsValid(val) {
|
||||||
|
var value = ValidatorGetValue(val.controltovalidate);
|
||||||
|
if (ValidatorTrim(value).length == 0)
|
||||||
|
return true;
|
||||||
|
var rx = new RegExp(val.validationexpression);
|
||||||
|
var matches = rx.exec(value);
|
||||||
|
return (matches != null && value == matches[0]);
|
||||||
|
}
|
||||||
|
function ValidatorTrim(s) {
|
||||||
|
var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
|
||||||
|
return (m == null) ? "" : m[1];
|
||||||
|
}
|
||||||
|
function RequiredFieldValidatorEvaluateIsValid(val) {
|
||||||
|
return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))
|
||||||
|
}
|
||||||
|
function RangeValidatorEvaluateIsValid(val) {
|
||||||
|
var value = ValidatorGetValue(val.controltovalidate);
|
||||||
|
if (ValidatorTrim(value).length == 0)
|
||||||
|
return true;
|
||||||
|
return (ValidatorCompare(value, val.minimumvalue, "GreaterThanEqual", val) &&
|
||||||
|
ValidatorCompare(value, val.maximumvalue, "LessThanEqual", val));
|
||||||
|
}
|
||||||
|
function ValidationSummaryOnSubmit(validationGroup) {
|
||||||
|
if (typeof(Page_ValidationSummaries) == "undefined")
|
||||||
|
return;
|
||||||
|
var summary, sums, s;
|
||||||
|
var headerSep, first, pre, post, end;
|
||||||
|
for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {
|
||||||
|
summary = Page_ValidationSummaries[sums];
|
||||||
|
if (!summary) continue;
|
||||||
|
summary.style.display = "none";
|
||||||
|
if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {
|
||||||
|
var i;
|
||||||
|
if (summary.showsummary != "False") {
|
||||||
|
summary.style.display = "";
|
||||||
|
if (typeof(summary.displaymode) != "string") {
|
||||||
|
summary.displaymode = "BulletList";
|
||||||
|
}
|
||||||
|
switch (summary.displaymode) {
|
||||||
|
case "List":
|
||||||
|
headerSep = "<br>";
|
||||||
|
first = "";
|
||||||
|
pre = "";
|
||||||
|
post = "<br>";
|
||||||
|
end = "";
|
||||||
|
break;
|
||||||
|
case "BulletList":
|
||||||
|
default:
|
||||||
|
headerSep = "";
|
||||||
|
first = "<ul>";
|
||||||
|
pre = "<li>";
|
||||||
|
post = "</li>";
|
||||||
|
end = "</ul>";
|
||||||
|
break;
|
||||||
|
case "SingleParagraph":
|
||||||
|
headerSep = " ";
|
||||||
|
first = "";
|
||||||
|
pre = "";
|
||||||
|
post = " ";
|
||||||
|
end = "<br>";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s = "";
|
||||||
|
if (typeof(summary.headertext) == "string") {
|
||||||
|
s += summary.headertext + headerSep;
|
||||||
|
}
|
||||||
|
s += first;
|
||||||
|
for (i=0; i<Page_Validators.length; i++) {
|
||||||
|
if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
|
||||||
|
s += pre + Page_Validators[i].errormessage + post;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s += end;
|
||||||
|
summary.innerHTML = s;
|
||||||
|
window.scrollTo(0,0);
|
||||||
|
}
|
||||||
|
if (summary.showmessagebox == "True") {
|
||||||
|
s = "";
|
||||||
|
if (typeof(summary.headertext) == "string") {
|
||||||
|
s += summary.headertext + "\r\n";
|
||||||
|
}
|
||||||
|
var lastValIndex = Page_Validators.length - 1;
|
||||||
|
for (i=0; i<=lastValIndex; i++) {
|
||||||
|
if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
|
||||||
|
switch (summary.displaymode) {
|
||||||
|
case "List":
|
||||||
|
s += Page_Validators[i].errormessage;
|
||||||
|
if (i < lastValIndex) {
|
||||||
|
s += "\r\n";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "BulletList":
|
||||||
|
default:
|
||||||
|
s += "- " + Page_Validators[i].errormessage;
|
||||||
|
if (i < lastValIndex) {
|
||||||
|
s += "\r\n";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "SingleParagraph":
|
||||||
|
s += Page_Validators[i].errormessage + " ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
alert(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window.jQuery) {
|
||||||
|
(function ($) {
|
||||||
|
var dataValidationAttribute = "data-val",
|
||||||
|
dataValidationSummaryAttribute = "data-valsummary",
|
||||||
|
normalizedAttributes = { validationgroup: "validationGroup", focusonerror: "focusOnError" };
|
||||||
|
function getAttributesWithPrefix(element, prefix) {
|
||||||
|
var i,
|
||||||
|
attribute,
|
||||||
|
list = {},
|
||||||
|
attributes = element.attributes,
|
||||||
|
length = attributes.length,
|
||||||
|
prefixLength = prefix.length;
|
||||||
|
prefix = prefix.toLowerCase();
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
attribute = attributes[i];
|
||||||
|
if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {
|
||||||
|
list[attribute.name.substr(prefixLength)] = attribute.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
function normalizeKey(key) {
|
||||||
|
key = key.toLowerCase();
|
||||||
|
return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];
|
||||||
|
}
|
||||||
|
function addValidationExpando(element) {
|
||||||
|
var attributes = getAttributesWithPrefix(element, dataValidationAttribute + "-");
|
||||||
|
$.each(attributes, function (key, value) {
|
||||||
|
element[normalizeKey(key)] = value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function dispose(element) {
|
||||||
|
var index = $.inArray(element, Page_Validators);
|
||||||
|
if (index >= 0) {
|
||||||
|
Page_Validators.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function addNormalizedAttribute(name, normalizedName) {
|
||||||
|
normalizedAttributes[name.toLowerCase()] = normalizedName;
|
||||||
|
}
|
||||||
|
function parseSpecificAttribute(selector, attribute, validatorsArray) {
|
||||||
|
return $(selector).find("[" + attribute + "='true']").each(function (index, element) {
|
||||||
|
addValidationExpando(element);
|
||||||
|
element.dispose = function () { dispose(element); element.dispose = null; };
|
||||||
|
if ($.inArray(element, validatorsArray) === -1) {
|
||||||
|
validatorsArray.push(element);
|
||||||
|
}
|
||||||
|
}).length;
|
||||||
|
}
|
||||||
|
function parse(selector) {
|
||||||
|
var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);
|
||||||
|
length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
function loadValidators() {
|
||||||
|
if (typeof (ValidatorOnLoad) === "function") {
|
||||||
|
ValidatorOnLoad();
|
||||||
|
}
|
||||||
|
if (typeof (ValidatorOnSubmit) === "undefined") {
|
||||||
|
window.ValidatorOnSubmit = function () {
|
||||||
|
return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function registerUpdatePanel() {
|
||||||
|
if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {
|
||||||
|
var prm = Sys.WebForms.PageRequestManager.getInstance(),
|
||||||
|
postBackElement, endRequestHandler;
|
||||||
|
if (prm.get_isInAsyncPostBack()) {
|
||||||
|
endRequestHandler = function (sender, args) {
|
||||||
|
if (parse(document)) {
|
||||||
|
loadValidators();
|
||||||
|
}
|
||||||
|
prm.remove_endRequest(endRequestHandler);
|
||||||
|
endRequestHandler = null;
|
||||||
|
};
|
||||||
|
prm.add_endRequest(endRequestHandler);
|
||||||
|
}
|
||||||
|
prm.add_beginRequest(function (sender, args) {
|
||||||
|
postBackElement = args.get_postBackElement();
|
||||||
|
});
|
||||||
|
prm.add_pageLoaded(function (sender, args) {
|
||||||
|
var i, panels, valFound = 0;
|
||||||
|
if (typeof (postBackElement) === "undefined") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
panels = args.get_panelsUpdated();
|
||||||
|
for (i = 0; i < panels.length; i++) {
|
||||||
|
valFound += parse(panels[i]);
|
||||||
|
}
|
||||||
|
panels = args.get_panelsCreated();
|
||||||
|
for (i = 0; i < panels.length; i++) {
|
||||||
|
valFound += parse(panels[i]);
|
||||||
|
}
|
||||||
|
if (valFound) {
|
||||||
|
loadValidators();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$(function () {
|
||||||
|
if (typeof (Page_Validators) === "undefined") {
|
||||||
|
window.Page_Validators = [];
|
||||||
|
}
|
||||||
|
if (typeof (Page_ValidationSummaries) === "undefined") {
|
||||||
|
window.Page_ValidationSummaries = [];
|
||||||
|
}
|
||||||
|
if (typeof (Page_ValidationActive) === "undefined") {
|
||||||
|
window.Page_ValidationActive = false;
|
||||||
|
}
|
||||||
|
$.WebFormValidator = {
|
||||||
|
addNormalizedAttribute: addNormalizedAttribute,
|
||||||
|
parse: parse
|
||||||
|
};
|
||||||
|
if (parse(document)) {
|
||||||
|
loadValidators();
|
||||||
|
}
|
||||||
|
registerUpdatePanel();
|
||||||
|
});
|
||||||
|
} (jQuery));
|
||||||
|
}
|
2014
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/bootstrap.js
vendored
Normal file
21
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/bootstrap.min.js
vendored
Normal file
2671
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/jquery-1.10.2.intellisense.js
vendored
Normal file
9803
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/jquery-1.10.2.js
vendored
Normal file
23
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/jquery-1.10.2.min.js
vendored
Normal file
1416
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/modernizr-2.6.2.js
vendored
Normal file
340
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/respond.js
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
/* NUGET: BEGIN LICENSE TEXT
|
||||||
|
*
|
||||||
|
* Microsoft grants you the right to use these script files for the sole
|
||||||
|
* purpose of either: (i) interacting through your browser with the Microsoft
|
||||||
|
* website or online service, subject to the applicable licensing or use
|
||||||
|
* terms; or (ii) using the files as included with a Microsoft product subject
|
||||||
|
* to that product's license terms. Microsoft reserves all other rights to the
|
||||||
|
* files not expressly granted by Microsoft, whether by implication, estoppel
|
||||||
|
* or otherwise. Insofar as a script file is dual licensed under GPL,
|
||||||
|
* Microsoft neither took the code under GPL nor distributes it thereunder but
|
||||||
|
* under the terms set out in this paragraph. All notices and licenses
|
||||||
|
* below are for informational purposes only.
|
||||||
|
*
|
||||||
|
* NUGET: END LICENSE TEXT */
|
||||||
|
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
|
||||||
|
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
|
||||||
|
window.matchMedia = window.matchMedia || (function(doc, undefined){
|
||||||
|
|
||||||
|
var bool,
|
||||||
|
docElem = doc.documentElement,
|
||||||
|
refNode = docElem.firstElementChild || docElem.firstChild,
|
||||||
|
// fakeBody required for <FF4 when executed in <head>
|
||||||
|
fakeBody = doc.createElement('body'),
|
||||||
|
div = doc.createElement('div');
|
||||||
|
|
||||||
|
div.id = 'mq-test-1';
|
||||||
|
div.style.cssText = "position:absolute;top:-100em";
|
||||||
|
fakeBody.style.background = "none";
|
||||||
|
fakeBody.appendChild(div);
|
||||||
|
|
||||||
|
return function(q){
|
||||||
|
|
||||||
|
div.innerHTML = '­<style media="'+q+'"> #mq-test-1 { width: 42px; }</style>';
|
||||||
|
|
||||||
|
docElem.insertBefore(fakeBody, refNode);
|
||||||
|
bool = div.offsetWidth == 42;
|
||||||
|
docElem.removeChild(fakeBody);
|
||||||
|
|
||||||
|
return { matches: bool, media: q };
|
||||||
|
};
|
||||||
|
|
||||||
|
})(document);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
|
||||||
|
(function( win ){
|
||||||
|
//exposed namespace
|
||||||
|
win.respond = {};
|
||||||
|
|
||||||
|
//define update even in native-mq-supporting browsers, to avoid errors
|
||||||
|
respond.update = function(){};
|
||||||
|
|
||||||
|
//expose media query support flag for external use
|
||||||
|
respond.mediaQueriesSupported = win.matchMedia && win.matchMedia( "only all" ).matches;
|
||||||
|
|
||||||
|
//if media queries are supported, exit here
|
||||||
|
if( respond.mediaQueriesSupported ){ return; }
|
||||||
|
|
||||||
|
//define vars
|
||||||
|
var doc = win.document,
|
||||||
|
docElem = doc.documentElement,
|
||||||
|
mediastyles = [],
|
||||||
|
rules = [],
|
||||||
|
appendedEls = [],
|
||||||
|
parsedSheets = {},
|
||||||
|
resizeThrottle = 30,
|
||||||
|
head = doc.getElementsByTagName( "head" )[0] || docElem,
|
||||||
|
base = doc.getElementsByTagName( "base" )[0],
|
||||||
|
links = head.getElementsByTagName( "link" ),
|
||||||
|
requestQueue = [],
|
||||||
|
|
||||||
|
//loop stylesheets, send text content to translate
|
||||||
|
ripCSS = function(){
|
||||||
|
var sheets = links,
|
||||||
|
sl = sheets.length,
|
||||||
|
i = 0,
|
||||||
|
//vars for loop:
|
||||||
|
sheet, href, media, isCSS;
|
||||||
|
|
||||||
|
for( ; i < sl; i++ ){
|
||||||
|
sheet = sheets[ i ],
|
||||||
|
href = sheet.href,
|
||||||
|
media = sheet.media,
|
||||||
|
isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
|
||||||
|
|
||||||
|
//only links plz and prevent re-parsing
|
||||||
|
if( !!href && isCSS && !parsedSheets[ href ] ){
|
||||||
|
// selectivizr exposes css through the rawCssText expando
|
||||||
|
if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
|
||||||
|
translate( sheet.styleSheet.rawCssText, href, media );
|
||||||
|
parsedSheets[ href ] = true;
|
||||||
|
} else {
|
||||||
|
if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base)
|
||||||
|
|| href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
|
||||||
|
requestQueue.push( {
|
||||||
|
href: href,
|
||||||
|
media: media
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
makeRequests();
|
||||||
|
},
|
||||||
|
|
||||||
|
//recurse through request queue, get css text
|
||||||
|
makeRequests = function(){
|
||||||
|
if( requestQueue.length ){
|
||||||
|
var thisRequest = requestQueue.shift();
|
||||||
|
|
||||||
|
ajax( thisRequest.href, function( styles ){
|
||||||
|
translate( styles, thisRequest.href, thisRequest.media );
|
||||||
|
parsedSheets[ thisRequest.href ] = true;
|
||||||
|
makeRequests();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
//find media blocks in css text, convert to style blocks
|
||||||
|
translate = function( styles, href, media ){
|
||||||
|
var qs = styles.match( /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi ),
|
||||||
|
ql = qs && qs.length || 0,
|
||||||
|
//try to get CSS path
|
||||||
|
href = href.substring( 0, href.lastIndexOf( "/" )),
|
||||||
|
repUrls = function( css ){
|
||||||
|
return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" );
|
||||||
|
},
|
||||||
|
useMedia = !ql && media,
|
||||||
|
//vars used in loop
|
||||||
|
i = 0,
|
||||||
|
j, fullq, thisq, eachq, eql;
|
||||||
|
|
||||||
|
//if path exists, tack on trailing slash
|
||||||
|
if( href.length ){ href += "/"; }
|
||||||
|
|
||||||
|
//if no internal queries exist, but media attr does, use that
|
||||||
|
//note: this currently lacks support for situations where a media attr is specified on a link AND
|
||||||
|
//its associated stylesheet has internal CSS media queries.
|
||||||
|
//In those cases, the media attribute will currently be ignored.
|
||||||
|
if( useMedia ){
|
||||||
|
ql = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for( ; i < ql; i++ ){
|
||||||
|
j = 0;
|
||||||
|
|
||||||
|
//media attr
|
||||||
|
if( useMedia ){
|
||||||
|
fullq = media;
|
||||||
|
rules.push( repUrls( styles ) );
|
||||||
|
}
|
||||||
|
//parse for styles
|
||||||
|
else{
|
||||||
|
fullq = qs[ i ].match( /@media *([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1;
|
||||||
|
rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
eachq = fullq.split( "," );
|
||||||
|
eql = eachq.length;
|
||||||
|
|
||||||
|
for( ; j < eql; j++ ){
|
||||||
|
thisq = eachq[ j ];
|
||||||
|
mediastyles.push( {
|
||||||
|
media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all",
|
||||||
|
rules : rules.length - 1,
|
||||||
|
hasquery: thisq.indexOf("(") > -1,
|
||||||
|
minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
|
||||||
|
maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
applyMedia();
|
||||||
|
},
|
||||||
|
|
||||||
|
lastCall,
|
||||||
|
|
||||||
|
resizeDefer,
|
||||||
|
|
||||||
|
// returns the value of 1em in pixels
|
||||||
|
getEmValue = function() {
|
||||||
|
var ret,
|
||||||
|
div = doc.createElement('div'),
|
||||||
|
body = doc.body,
|
||||||
|
fakeUsed = false;
|
||||||
|
|
||||||
|
div.style.cssText = "position:absolute;font-size:1em;width:1em";
|
||||||
|
|
||||||
|
if( !body ){
|
||||||
|
body = fakeUsed = doc.createElement( "body" );
|
||||||
|
body.style.background = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
body.appendChild( div );
|
||||||
|
|
||||||
|
docElem.insertBefore( body, docElem.firstChild );
|
||||||
|
|
||||||
|
ret = div.offsetWidth;
|
||||||
|
|
||||||
|
if( fakeUsed ){
|
||||||
|
docElem.removeChild( body );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
body.removeChild( div );
|
||||||
|
}
|
||||||
|
|
||||||
|
//also update eminpx before returning
|
||||||
|
ret = eminpx = parseFloat(ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
//cached container for 1em value, populated the first time it's needed
|
||||||
|
eminpx,
|
||||||
|
|
||||||
|
//enable/disable styles
|
||||||
|
applyMedia = function( fromResize ){
|
||||||
|
var name = "clientWidth",
|
||||||
|
docElemProp = docElem[ name ],
|
||||||
|
currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
|
||||||
|
styleBlocks = {},
|
||||||
|
lastLink = links[ links.length-1 ],
|
||||||
|
now = (new Date()).getTime();
|
||||||
|
|
||||||
|
//throttle resize calls
|
||||||
|
if( fromResize && lastCall && now - lastCall < resizeThrottle ){
|
||||||
|
clearTimeout( resizeDefer );
|
||||||
|
resizeDefer = setTimeout( applyMedia, resizeThrottle );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lastCall = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( var i in mediastyles ){
|
||||||
|
var thisstyle = mediastyles[ i ],
|
||||||
|
min = thisstyle.minw,
|
||||||
|
max = thisstyle.maxw,
|
||||||
|
minnull = min === null,
|
||||||
|
maxnull = max === null,
|
||||||
|
em = "em";
|
||||||
|
|
||||||
|
if( !!min ){
|
||||||
|
min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
|
||||||
|
}
|
||||||
|
if( !!max ){
|
||||||
|
max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
|
||||||
|
if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
|
||||||
|
if( !styleBlocks[ thisstyle.media ] ){
|
||||||
|
styleBlocks[ thisstyle.media ] = [];
|
||||||
|
}
|
||||||
|
styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove any existing respond style element(s)
|
||||||
|
for( var i in appendedEls ){
|
||||||
|
if( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){
|
||||||
|
head.removeChild( appendedEls[ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//inject active styles, grouped by media type
|
||||||
|
for( var i in styleBlocks ){
|
||||||
|
var ss = doc.createElement( "style" ),
|
||||||
|
css = styleBlocks[ i ].join( "\n" );
|
||||||
|
|
||||||
|
ss.type = "text/css";
|
||||||
|
ss.media = i;
|
||||||
|
|
||||||
|
//originally, ss was appended to a documentFragment and sheets were appended in bulk.
|
||||||
|
//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
|
||||||
|
head.insertBefore( ss, lastLink.nextSibling );
|
||||||
|
|
||||||
|
if ( ss.styleSheet ){
|
||||||
|
ss.styleSheet.cssText = css;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ss.appendChild( doc.createTextNode( css ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//push to appendedEls to track for later removal
|
||||||
|
appendedEls.push( ss );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//tweaked Ajax functions from Quirksmode
|
||||||
|
ajax = function( url, callback ) {
|
||||||
|
var req = xmlHttp();
|
||||||
|
if (!req){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
req.open( "GET", url, true );
|
||||||
|
req.onreadystatechange = function () {
|
||||||
|
if ( req.readyState != 4 || req.status != 200 && req.status != 304 ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback( req.responseText );
|
||||||
|
}
|
||||||
|
if ( req.readyState == 4 ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
req.send( null );
|
||||||
|
},
|
||||||
|
//define ajax obj
|
||||||
|
xmlHttp = (function() {
|
||||||
|
var xmlhttpmethod = false;
|
||||||
|
try {
|
||||||
|
xmlhttpmethod = new XMLHttpRequest();
|
||||||
|
}
|
||||||
|
catch( e ){
|
||||||
|
xmlhttpmethod = new ActiveXObject( "Microsoft.XMLHTTP" );
|
||||||
|
}
|
||||||
|
return function(){
|
||||||
|
return xmlhttpmethod;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
//translate CSS
|
||||||
|
ripCSS();
|
||||||
|
|
||||||
|
//expose update for re-running respond later on
|
||||||
|
respond.update = ripCSS;
|
||||||
|
|
||||||
|
//adjust on resize
|
||||||
|
function callMedia(){
|
||||||
|
applyMedia( true );
|
||||||
|
}
|
||||||
|
if( win.addEventListener ){
|
||||||
|
win.addEventListener( "resize", callMedia, false );
|
||||||
|
}
|
||||||
|
else if( win.attachEvent ){
|
||||||
|
win.attachEvent( "onresize", callMedia );
|
||||||
|
}
|
||||||
|
})(this);
|
20
src/Web/Catalog.WebForms/Catalog.WebForms/Scripts/respond.min.js
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* NUGET: BEGIN LICENSE TEXT
|
||||||
|
*
|
||||||
|
* Microsoft grants you the right to use these script files for the sole
|
||||||
|
* purpose of either: (i) interacting through your browser with the Microsoft
|
||||||
|
* website or online service, subject to the applicable licensing or use
|
||||||
|
* terms; or (ii) using the files as included with a Microsoft product subject
|
||||||
|
* to that product's license terms. Microsoft reserves all other rights to the
|
||||||
|
* files not expressly granted by Microsoft, whether by implication, estoppel
|
||||||
|
* or otherwise. Insofar as a script file is dual licensed under GPL,
|
||||||
|
* Microsoft neither took the code under GPL nor distributes it thereunder but
|
||||||
|
* under the terms set out in this paragraph. All notices and licenses
|
||||||
|
* below are for informational purposes only.
|
||||||
|
*
|
||||||
|
* NUGET: END LICENSE TEXT */
|
||||||
|
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
|
||||||
|
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
|
||||||
|
window.matchMedia=window.matchMedia||(function(e,f){var c,a=e.documentElement,b=a.firstElementChild||a.firstChild,d=e.createElement("body"),g=e.createElement("div");g.id="mq-test-1";g.style.cssText="position:absolute;top:-100em";d.style.background="none";d.appendChild(g);return function(h){g.innerHTML='­<style media="'+h+'"> #mq-test-1 { width: 42px; }</style>';a.insertBefore(d,b);c=g.offsetWidth==42;a.removeChild(d);return{matches:c,media:h}}})(document);
|
||||||
|
|
||||||
|
/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
|
||||||
|
(function(e){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=e.matchMedia&&e.matchMedia("only all").matches;if(respond.mediaQueriesSupported){return}var w=e.document,s=w.documentElement,i=[],k=[],q=[],o={},h=30,f=w.getElementsByTagName("head")[0]||s,g=w.getElementsByTagName("base")[0],b=f.getElementsByTagName("link"),d=[],a=function(){var D=b,y=D.length,B=0,A,z,C,x;for(;B<y;B++){A=D[B],z=A.href,C=A.media,x=A.rel&&A.rel.toLowerCase()==="stylesheet";if(!!z&&x&&!o[z]){if(A.styleSheet&&A.styleSheet.rawCssText){m(A.styleSheet.rawCssText,z,C);o[z]=true}else{if((!/^([a-zA-Z:]*\/\/)/.test(z)&&!g)||z.replace(RegExp.$1,"").split("/")[0]===e.location.host){d.push({href:z,media:C})}}}}u()},u=function(){if(d.length){var x=d.shift();n(x.href,function(y){m(y,x.href,x.media);o[x.href]=true;u()})}},m=function(I,x,z){var G=I.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),J=G&&G.length||0,x=x.substring(0,x.lastIndexOf("/")),y=function(K){return K.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+x+"$2$3")},A=!J&&z,D=0,C,E,F,B,H;if(x.length){x+="/"}if(A){J=1}for(;D<J;D++){C=0;if(A){E=z;k.push(y(I))}else{E=G[D].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1;k.push(RegExp.$2&&y(RegExp.$2))}B=E.split(",");H=B.length;for(;C<H;C++){F=B[C];i.push({media:F.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:k.length-1,hasquery:F.indexOf("(")>-1,minw:F.match(/\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:F.match(/\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}}j()},l,r,v=function(){var z,A=w.createElement("div"),x=w.body,y=false;A.style.cssText="position:absolute;font-size:1em;width:1em";if(!x){x=y=w.createElement("body");x.style.background="none"}x.appendChild(A);s.insertBefore(x,s.firstChild);z=A.offsetWidth;if(y){s.removeChild(x)}else{x.removeChild(A)}z=p=parseFloat(z);return z},p,j=function(I){var x="clientWidth",B=s[x],H=w.compatMode==="CSS1Compat"&&B||w.body[x]||B,D={},G=b[b.length-1],z=(new Date()).getTime();if(I&&l&&z-l<h){clearTimeout(r);r=setTimeout(j,h);return}else{l=z}for(var E in i){var K=i[E],C=K.minw,J=K.maxw,A=C===null,L=J===null,y="em";if(!!C){C=parseFloat(C)*(C.indexOf(y)>-1?(p||v()):1)}if(!!J){J=parseFloat(J)*(J.indexOf(y)>-1?(p||v()):1)}if(!K.hasquery||(!A||!L)&&(A||H>=C)&&(L||H<=J)){if(!D[K.media]){D[K.media]=[]}D[K.media].push(k[K.rules])}}for(var E in q){if(q[E]&&q[E].parentNode===f){f.removeChild(q[E])}}for(var E in D){var M=w.createElement("style"),F=D[E].join("\n");M.type="text/css";M.media=E;f.insertBefore(M,G.nextSibling);if(M.styleSheet){M.styleSheet.cssText=F}else{M.appendChild(w.createTextNode(F))}q.push(M)}},n=function(x,z){var y=c();if(!y){return}y.open("GET",x,true);y.onreadystatechange=function(){if(y.readyState!=4||y.status!=200&&y.status!=304){return}z(y.responseText)};if(y.readyState==4){return}y.send(null)},c=(function(){var x=false;try{x=new XMLHttpRequest()}catch(y){x=new ActiveXObject("Microsoft.XMLHTTP")}return function(){return x}})();a();respond.update=a;function t(){j(true)}if(e.addEventListener){e.addEventListener("resize",t,false)}else{if(e.attachEvent){e.attachEvent("onresize",t)}}})(this);
|
@ -0,0 +1,75 @@
|
|||||||
|
using eShopOnContainers.Core.Extensions;
|
||||||
|
using eShopOnContainers.Core.Models.Catalog;
|
||||||
|
using System;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace eShopOnContainers.Core.Services.Catalog
|
||||||
|
{
|
||||||
|
|
||||||
|
// From https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogMockService.cs
|
||||||
|
// Issue: How to make this DRY, while preserving the story for a monolithic application.
|
||||||
|
// Note: Device specific conditionals have been removed.
|
||||||
|
public class CatalogMockService : ICatalogService
|
||||||
|
{
|
||||||
|
private ObservableCollection<CatalogBrand> MockCatalogBrand = new ObservableCollection<CatalogBrand>
|
||||||
|
{
|
||||||
|
new CatalogBrand { Id = 1, Brand = "Azure" },
|
||||||
|
new CatalogBrand { Id = 2, Brand = "Visual Studio" }
|
||||||
|
};
|
||||||
|
|
||||||
|
private ObservableCollection<CatalogType> MockCatalogType = new ObservableCollection<CatalogType>
|
||||||
|
{
|
||||||
|
new CatalogType { Id = 1, Type = "Mug" },
|
||||||
|
new CatalogType { Id = 2, Type = "T-Shirt" }
|
||||||
|
};
|
||||||
|
|
||||||
|
private ObservableCollection<CatalogItem> MockCatalog = new ObservableCollection<CatalogItem>
|
||||||
|
{
|
||||||
|
new CatalogItem { Id = Common.Common.MockCatalogItemId01, PictureUri = "Content/fake_product_01.png", Name = ".NET Bot Blue Sweatshirt (M)", Price = 19.50M, CatalogBrandId = 2, CatalogBrand = "Visual Studio", CatalogTypeId = 2, CatalogType = "T-Shirt" },
|
||||||
|
new CatalogItem { Id = Common.Common.MockCatalogItemId02, PictureUri = "Content/fake_product_02.png", Name = ".NET Bot Purple Sweatshirt (M)", Price = 19.50M, CatalogBrandId = 2, CatalogBrand = "Visual Studio", CatalogTypeId = 2, CatalogType = "T-Shirt" },
|
||||||
|
new CatalogItem { Id = Common.Common.MockCatalogItemId03, PictureUri = "Content/fake_product_03.png", Name = ".NET Bot Black Sweatshirt (M)", Price = 19.95M, CatalogBrandId = 2, CatalogBrand = "Visual Studio", CatalogTypeId = 2, CatalogType = "T-Shirt" },
|
||||||
|
new CatalogItem { Id = Common.Common.MockCatalogItemId04, PictureUri = "Content/fake_product_04.png", Name = ".NET Black Cupt", Price = 17.00M, CatalogBrandId = 2, CatalogBrand = "Visual Studio", CatalogTypeId = 1, CatalogType = "Mug" },
|
||||||
|
new CatalogItem { Id = Common.Common.MockCatalogItemId05, PictureUri = "Content/fake_product_05.png", Name = "Azure Black Sweatshirt (M)", Price = 19.50M, CatalogBrandId = 1, CatalogBrand = "Azure", CatalogTypeId = 2, CatalogType = "T-Shirt" }
|
||||||
|
};
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
return MockCatalog;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId)
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
return MockCatalog
|
||||||
|
.Where(c => c.CatalogBrandId == catalogBrandId &&
|
||||||
|
c.CatalogTypeId == catalogTypeId)
|
||||||
|
.ToObservableCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
return MockCatalogBrand;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
return MockCatalogType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<CatalogItem> GetCatalogItemAsync(string id)
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
return MockCatalog.FirstOrDefault(c => c.Id == id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,131 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using eShopOnContainers.Core.Models.Catalog;
|
||||||
|
using eShopOnContainers.Core.Services.RequestProvider;
|
||||||
|
using eShopOnContainers.Core.Extensions;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
// from https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs
|
||||||
|
// TODO: DRY this stuff.
|
||||||
|
namespace eShopOnContainers.Core.Services.Catalog
|
||||||
|
{
|
||||||
|
public class CatalogService : ICatalogService
|
||||||
|
{
|
||||||
|
private readonly IRequestProvider _requestProvider;
|
||||||
|
|
||||||
|
public CatalogService(IRequestProvider requestProvider)
|
||||||
|
{
|
||||||
|
_requestProvider = requestProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
|
||||||
|
|
||||||
|
builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId);
|
||||||
|
|
||||||
|
string uri = builder.ToString();
|
||||||
|
|
||||||
|
CatalogRoot catalog =
|
||||||
|
await _requestProvider.GetAsync<CatalogRoot>(uri);
|
||||||
|
|
||||||
|
if (catalog?.Data != null)
|
||||||
|
return catalog?.Data.ToObservableCollection();
|
||||||
|
else
|
||||||
|
return new ObservableCollection<CatalogItem>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new ObservableCollection<CatalogItem>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
|
||||||
|
|
||||||
|
builder.Path = "api/v1/catalog/items";
|
||||||
|
|
||||||
|
string uri = builder.ToString();
|
||||||
|
|
||||||
|
CatalogRoot catalog =
|
||||||
|
await _requestProvider.GetAsync<CatalogRoot>(uri);
|
||||||
|
|
||||||
|
if (catalog?.Data != null)
|
||||||
|
{
|
||||||
|
// TODO: ServicesHelper.FixCatalogItemPictureUri(catalog?.Data);
|
||||||
|
|
||||||
|
return catalog?.Data.ToObservableCollection();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return new ObservableCollection<CatalogItem>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new ObservableCollection<CatalogItem>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<CatalogItem> GetCatalogItemAsync(string id)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
|
||||||
|
|
||||||
|
builder.Path = "api/v1/catalog/catalogbrands";
|
||||||
|
|
||||||
|
string uri = builder.ToString();
|
||||||
|
|
||||||
|
IEnumerable<CatalogBrand> brands =
|
||||||
|
await _requestProvider.GetAsync<IEnumerable<CatalogBrand>>(uri);
|
||||||
|
|
||||||
|
if (brands != null)
|
||||||
|
return brands?.ToObservableCollection();
|
||||||
|
else
|
||||||
|
return new ObservableCollection<CatalogBrand>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new ObservableCollection<CatalogBrand>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// TODO:
|
||||||
|
UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
|
||||||
|
|
||||||
|
builder.Path = "api/v1/catalog/catalogtypes";
|
||||||
|
|
||||||
|
string uri = builder.ToString();
|
||||||
|
|
||||||
|
IEnumerable<CatalogType> types =
|
||||||
|
await _requestProvider.GetAsync<IEnumerable<CatalogType>>(uri);
|
||||||
|
|
||||||
|
if (types != null)
|
||||||
|
return types.ToObservableCollection();
|
||||||
|
else
|
||||||
|
return new ObservableCollection<CatalogType>();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new ObservableCollection<CatalogType>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
src/Web/Catalog.WebForms/Catalog.WebForms/Services/Common.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
namespace eShopOnContainers.Core.Services.Common
|
||||||
|
{
|
||||||
|
public static class Common
|
||||||
|
{
|
||||||
|
public static string MockCatalogItemId01 = "1";
|
||||||
|
public static string MockCatalogItemId02 = "2";
|
||||||
|
public static string MockCatalogItemId03 = "3";
|
||||||
|
public static string MockCatalogItemId04 = "4";
|
||||||
|
public static string MockCatalogItemId05 = "5";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
using eShopOnContainers.Core.Models.Catalog;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
// Taken from https://github.com/dotnet/eShopOnContainers/blob/vs2017/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/ICatalogService.cs
|
||||||
|
// Open Issue: How do we make this application DRY and still support the story
|
||||||
|
// of a 'monolithic' app for a 'Lift and Shift' scenario?
|
||||||
|
namespace eShopOnContainers.Core.Services.Catalog
|
||||||
|
{
|
||||||
|
public interface ICatalogService
|
||||||
|
{
|
||||||
|
Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync();
|
||||||
|
Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId);
|
||||||
|
Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync();
|
||||||
|
Task<ObservableCollection<CatalogItem>> GetCatalogAsync();
|
||||||
|
Task<CatalogItem> GetCatalogItemAsync(string id);
|
||||||
|
}
|
||||||
|
}
|