Silvelight can be integrated with SharePoint sites to provide richness and improve the user experience of the SharePoint sites. There are many ways to integrate the silverlight application (xap) with SharePoint sites. The first option is to leverage the content editor web part and render the silverlight application (xap) through html and JavaScript. This is the simplest way to integrate silverlight applications with SharePoint sites. The other option is to to create a custom web part that does the rendering of the silverlight application.
In this blog post, I'd be sharing the steps to render silverlight applications by leveraging the content editor web part.
Step1
Go the virtual directory in IIS, corresponding to the SharePoint web application. In my case it is C:\inetpub\wwwroot\wss\VirtualDirectories\1111
Create a sub-folder by name silverlight_bin under the C:\inetpub\wwwroot\wss\VirtualDirectories\1111
Copy the silverlight application (xap) from the bin\debug directory of silverlight project to the sub-folder silverlight_bin
Step2
Add the content editor web part to the page
Step3
Click ‘Modify shared web part’ and enter the following html snippet to the web part to the source editor of the content editor web part
<object
data=”data:application/x‐silverlight,”
type=”application/x‐silverlight‐2‐b2”
width=”400” height=”300”>
<param
name=”source”
value=”/Silverlight_Bin/yoursilverlightapp.xap”/>
</object>
Sometimes specifying the object tag in content editor web part may not work properly. If it does not work properly, we need create the object tags and other attributes using javascript.
I came across the following useful learning resources of visual studio 2010 and .NET 4.0 beta2.
Visual studio 2010 and .NET 4.0 Training Course http://channel9.msdn.com/learn/courses/VS2010/
Visual studio 2010 and .NET 4.0 beta2 walkthroughs http://msdn.microsoft.com/en-us/vstudio/dd441784.aspx
Learning resources for visual studio 2010 http://www.microsoft.com/downloads/details.aspx?FamilyID=752CB725-969B-4732-A383-ED5740F02E93&displaylang=en
The beta2 of visual studio 2010 and .NET 4.0 is released. It can be downloaded in msdn. The url is below :-
http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx
The following snippet contains the script to retract sharepoint solution packages and de-activate features. This would be become handy to the sharepoint adminstrators, when they want to retract multiple solution packages (wsp) and de-activate multiple features.
:begin
@echo off
rem ** declare the solution to be retracted **
set solutionName=SampleSolution
rem ** declare the set of fetures to be de-activated **
set featureSampleFeature1=SampleFeature1
set featureSampleFeature2=SampleFeature2
set featureSampleFeature3=SampleFeature3
rem ** Replace this value with the URL of your site **
@set url=http://servername/sites/sitecollectioname/sitename
@set PATH=C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN;%PATH%
echo deactivating features in solution %solutionName%...
echo ----------------------------------------------------
stsadm -o deactivatefeature -name %featureSampleFeature1% -url %url% -force
stsadm -o deactivatefeature -name %featureSampleFeature2% -url %url% -force
stsadm -o deactivatefeature -name %featureSampleFeature3% -url %url% -force
echo Attempting to uninstallfeature and retract solution
echo ---------------------------------------------------
echo Rectracting solution %solutionName% from solution store...
stsadm -o retractsolution -name %solutionName%.wsp -immediate
stsadm -o execadmsvcjobs
echo Deleting solution %solutionName% from solution store...
stsadm -o deletesolution -name %solutionName%.wsp -override
echo.
if errorlevel == 0 goto :success
:success
echo Successfully deployed solution and activated feature(s)..
echo .
goto end
:end
pause
There are times, where we need to create an application page to be accessed anonymously by the user, instead of the user signing-in and accessing the page. Here is the code-snippet to create an unsecure application page for sharepoint.
public partial class UnsecureApplicationPage : Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase
// inherit the page from Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase instead of Microsoft.SharePoint.WebControls.LayoutsPageBase
{
protected void Page_Load(object sender, EventArgs e)
{
}
//override the allow anonymous property to true
protected override bool AllowAnonymousAccess
{
get { return true; }
}
protected override bool AllowNullWeb { get { return true; } }
protected override void OnPreInit(EventArgs e)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
base.OnPreInit(e);
Microsoft.SharePoint.SPWeb _Web = SPControl.GetContextWeb(Context);
this.MasterPageFile = _Web.MasterUrl;
});
}
}
Creating an application page for sharepoint is fairly simple and straight-forward. To make that application page secure, just do some extra steps in the code. Here is the code-snippet for creating secure application page in sharepoint .
public partial class SampleSecurePage : Microsoft.SharePoint.WebControls.LayoutsPageBase
{
public SampleSecurePage()
{
//In the constructor define rights check mode to be done on the pre-init event
this.RightsCheckMode = RightsCheckModes.OnPreInit;
}
//get the permission set from spbase permission enumeration
protected override SPBasePermissions RightsRequired
{
get
{
SPBasePermissions permissions = base.RightsRequired;
return permissions;
}
}
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
Microsoft.SharePoint.SPWeb _Web = SPControl.GetContextWeb(Context);
//dynamically assign the master of the current spweb to the application page
this.MasterPageFile = _Web.MasterUrl;
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
//re-direct the user to log-in page and authenticate
}
}
protected void Page_Load(object sender, EventArgs e)
{
//do some logic here
}
}
The following is the script that can automate manual installation of wsps and activation of features.
:begin
@echo off
rem ** mention the name of the wsp to be installed **
set solutionName=SampleSolution
rem ** declare list of features to be installed **
set featureSampleFeature1=SampleFeature1
set featureSampleFeature2=SampleFeature2
set featureSampleFeature3=SampleFeature3
rem ** Replace this value with the URL of your site or sitecollection**
@set url=http://servername/sites/sitecollection/sitename
@set PATH=C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN;%PATH%
stsadm -o retractsolution -name %solutionName%.wsp -immediate
stsadm -o execadmsvcjobs
stsadm -o deletesolution -name %solutionName%.wsp -override
echo Adding solution %solutionName% to solution store...
echo ----------------------------------------------------
stsadm -o addsolution -filename %solutionName%.wsp
if errorlevel == 0 goto :deploySolution
echo ### Error adding solution %solutionName%
echo .
goto end
:deploySolution
echo Deploying solution %solutionName%...
echo ----------------------------------------------------
stsadm -o deploysolution -name %solutionName%.wsp -url %url% -immediate -allowGacDeployment -allowCasPolicies -force
stsadm -o execadmsvcjobs
if errorlevel == 0 goto :activateFeature
echo ### Error deploying solution %solutionName%
echo .
goto end
:activateFeature
echo Activating features in solution %solutionName%...
echo ----------------------------------------------------
stsadm -o activatefeature -name %featureSampleFeature1% -url %url% -force
stsadm -o activatefeature -name %featureSampleFeature2% -url %url% -force
stsadm -o activatefeature -name %featureSampleFeature3% -url %url% -force
if errorlevel == 0 goto :success
echo ### Error activating features
echo .
goto end
:success
echo Successfully deployed solution and activated feature(s)..
echo .
goto end
:end
pause
Many a times, we'd find the need for leveraging the javascript in sharepoint web parts. It could be a simple requirement of opening up a pop-up window or could be a complex requirement to invoke a web service from javascript. Here is code-snippet and steps to leverage java script inside sharepoint web parts. The crux is to embeed or register the javascript function in the PreRender event of the web part and invoke this registered javascript, from wherever desired.
//In the constructor of the web part, define a delegate of the PreRender method.
public SampleWebPart()
{
this.PreRender += new EventHandler(SampleWebPart_ClientScript_PreRender);
}
#region register javascript methods
//In the delegate method of PreRender, call the another method that does the registering of javascript
// Client script registration event
private void SampleWebPart_ClientScript_PreRender(object sender, System.EventArgs e)
{
RegisterJavaScript();
}
//Use the RegisterClientScriptBlock method of the Page object, to register the javascript
//Function will embedded script
protected void RegisterJavasScript()
{
//format the string to hold the javascript
string embeedscript = " <script>" +
"function openNewWin(url) {" +
//"var x = window.open(url, 'mynewwin', 'width=1200,height=800');" +
"var x = window.open(url);" +
"x.focus();" +
"} " +
"</script>";
string OpenScriptKey = "OpenNewWin";
//check whether the javascript has been already registered to the page
if (!Page.IsClientScriptBlockRegistered(OpenScriptKey))
{
Page.RegisterClientScriptBlock(OpenScriptKey, embeedscript);
}
}
protected void Button1_click(object sender, ImageClickEventArgs e)
{
//invoke the javascript function that opens the application page in new window
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "OpenWin", "<script>openNewWin('" + url + "')</script>");
}
Microsoft launched a number of Web Application Toolkits.
What is a web application ToolKit ?
Web Application Toolkits provide the packaged set of running samples, templates and documentation that enables the web developers to extend their web application capabilities
In the Microsoft WebSiteSpark launch, 7 Web Application Toolkits has been released.
Here is the list of technical resources, that I've found in September 09 Technet rollup and I'm aggregating them below.
Microsoft Forefront Server Security Management Console Documentation
Forefront Server Security Management Console allows administrators to easily manage Forefront Security for Exchange Server, Forefront Security for SharePoint, and Microsoft Antigen.http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=ae4ce23b-9e1e-455c-87a4-36167fe43107
Office SharePoint Server IT Pro content CHM
Downloadable CHM version of SharePoint Server content on TechNet. http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=ba006584-711d-4ce7-9e1f-181aedf6434a
Microsoft SharePoint Administration Toolkit v4.0 x86
The Microsoft® SharePoint® Administration Toolkit contains functionality to help administrate and manage Microsoft® Office SharePoint® Server 2007 and Windows® SharePoint® Services version 3.0.http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=cd2d09a7-1159-4d40-be1c-8efab1345381
Microsoft SharePoint Administration Toolkit v4.0 x64
The Microsoft® SharePoint® Administration Toolkit contains functionality to help administrate and manage Microsoft® Office SharePoint® Server 2007 and Windows® SharePoint® Services version 3.0.http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=665e98ea-5318-486d-aba2-2bfe46254357
Windows SharePoint Services 3.0 IT Pro content CHM
Downloadable CHM version of Windows SharePoint Services 3.0 content on TechNet. http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=c9d6c8c5-8a62-4961-8c1b-df08b667b1c4
Microsoft SharePoint Administration Toolkit v4.0 x86
The Microsoft® SharePoint® Administration Toolkit contains functionality to help administrate and manage Microsoft® Office SharePoint® Server 2007 and Windows® SharePoint® Services version 3.0. http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=cd2d09a7-1159-4d40-be1c-8efab1345381
Microsoft SharePoint Administration Toolkit v4.0 x64
The Microsoft® SharePoint® Administration Toolkit contains functionality to help administrate and manage Microsoft® Office SharePoint® Server 2007 and Windows® SharePoint® Services version 3.0.http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=665e98ea-5318-486d-aba2-2bfe46254357
Migration Manager for SharePoint
Migration Manager 2.0 provides a solid migration project management framework on top of Microsoft Content Migration API and the stsadm utility that automates and streamlines content migration for SharePoint 2007 (both MOSS and WSS 3.0) deployments.http://sharepointforall.com/blogs/team/archive/2009/06/11/sneak-preview-of-migration-manager-for-sharepoint-2-0-part-i.aspx
SharePoint Diagnostics (SPDiag) Tool v1.0 for SharePoint Products and Technologies What does this tool do?
The SharePoint Diagnostics (SPDiag) tool v1.0 greatly simplifies the process of gathering and analyzing troubleshooting data, and can significantly reduce the time needed to diagnose issues. SPDiag v1.0 provides administrators with a unified interface for troubleshooting SharePoint performance issues, and saves collected data and reports to a SQL Server database.
Microsoft SharePoint Administration Toolkit v3.0 x86: http://go.microsoft.com/fwlink/?LinkId=141504
Microsoft SharePoint Administration Toolkit v3.0 x64: http://go.microsoft.com/fwlink/?LinkId=142035
SharePoint Diagnostics Tool (SPDiag) User Guide: http://www.microsoft.com/DownLoads/details.aspx?familyid=1C222804-51C7-4BB5-AE3D-89C68AD27A78&displaylang=en
SQLDiag and PSSDiag
PSSDIAG is also a diagnostics utility used to collect profiler trace, perfmon data for SQL Server. PSSDAIG was created to troubleshoot SQL Server 7.0 and 2000 issues. It evolved into SQL Server 2005 sqldiag. http://sqlnexus.codeplex.com/Wiki/View.aspx?title=PSSDiag
Pre-upgrade scanning and reporting for future releases (Windows SharePoint Services)
The Upgrade Checker will scan your SharePoint Server 2007 deployment for many issues that could affect a future upgrade to SharePoint 2010, ships with SP2.
http://technet.microsoft.com/en-us/library/dd793607.aspx
Best Practices Resource Center for SharePoint Server 2007
To avoid common pitfalls and keep your Office SharePoint Server 2007 environment available and performing well, follow these best practices based on real-world experience from Microsoft Consulting Services and the product team. http://technet.microsoft.com/en-us/office/sharepointserver/bb736746.aspx
SharePoint Disaster Recovery Advisor Tool Now Available as Freeware!
What does this tool do?
Reads your farm configuration from the database backup or from the live config database, Lists all the servers, databases and services in the farm. Verifies availability of all these components in real time, Verifies and re-creates appropriate SQL Server logins to enable SharePoint services access to the databases, In a DR situation, advises on the psconfig.exe commands needed to provision SharePoint front end, Central Administration, and application servers
http://sharepointforall.com/blogs/team/archive/2009/03/06/sharepoint-disaster-recovery-advisor-tool-now-available-as-freeware.aspx#143
Site Administrator Repository Query Tool
This tool allows you to run simple and quick queries from the Site Administrator repository, which includes information gathered about systems, as well as configuration information on Recovery Manager for SharePoint and Migration tools.http://sharepointforall.com/media/p/8.aspx
SharePoint PowerShell PowerPack v1 Feb 2009
This download includes 4 PowerPacks.
SharePoint PowerPack - List the SharePoint Webs, folders, and List, and monitor the SharePoint usage.
SharePoint Farm PowerPack - Monitor your SharePoint farm servers, services, web services and web applications
SharePoint Remove Access PowerPack - PowerPack which connects to SharePoint over its webservices
SharePoint Navigator PowerPack - allows you to display the properties of the local farm, get a list of servers running in your farm, list SharePoint services and monitor the status and which services needs upgrade, and list the web services and web applications.
http://sharepointforall.com/media/p/38.aspx
SmartTools for SharePoint
The SmartTools for SharePoint project is a collection of SharePoint extensions to make your life as a SharePoint user, developer or administrator a little bit easier!
http://smarttools.codeplex.com/
Here is video that has the introduction to application architecture by David Hill.
In this post, I'm just going to deal with how to create and host surveys in the sharepoint publishing environment. I’m just putting together all the thoughts and experiencs on this area. MOSS 2007 provide the out-of-box capability of creating and hosting surveys. The Survey comes a Survey List, packaged as a part of Team Site Definition. So when we create SharePoint implementations of type Team Site, the surveys are readily available with the site-template, the administrator can just create a list of type survey and proceed from then on. However there are scenarios where we need to host survey functionality in sharepoint implementation of type Publishing Portals. Since survey list do not come with the publishing portal, we can create a feature that defines the survey list and deploy this feature to the sites created out of publishing portal. The site or site-collection administrator can activate the survey feature, that would make the way for the content authors to embed the survey functionality in publishing portals.
The challenging part is to make the survey working in the authoring-publishing environment. In the authoring environment the survey questions would be created. However the end users would answer the survey questions in the publishing environment.
Will the content deployment job work fine if we have blank survey list in authoring and a non-empty survey response in publishing ? Yes, i tried this scenario. I tried content deployment jobs whenever every user respond to a survey questions. This works fine. The CDS job does not overwrite publishing survey list with the blank survey list from authoring.
The next part is to address the permissions for responding to survey and permissions for viewing survey response. Out-of-box the survey list, needs the contributor rights for the end-user to respond to the survey. If we’ve a large portal with 1000’s of users, we’d need a tool to provide the contributor permissions for each user. If we have the option of creating custom user interface (web part) for the surveys, we can address this survey security, in a different way by running the web part code with elevated privileges when it tries to submit the data to survey list. This privilege elevation is just momentary, until submitting survey response to sharepoint list. The option of run with elevated privileges gives an alternative to create a custom tool for survey list permissions.
The last part is on the security for survey response. The best way to address this requirement is to host the entire survey list under a different sub-site of the portal. Provide the access to this sub-site, only for selected set of users, who want to view the survey response.
Many a times, i've seen in MSDN Forums where people asking for the much granular-level of list security like who can read the list items and who can write/update t sayihe list items. There are couple of properties called ReadSecurity and Write Security in the SPListClass, that provides the more granular level of security.
The ReadSecurity property of the SPList gets or sets the Read security setting for the list. It can have the possible values of 1 or 2.
1- indicates all users can read the list items
2 - indicates the users can read the items only that they create
The WriteSecurity property of the SPList gets or sets the Read security setting for the list. It can have the possible values of 1, 2 and 4.
1 - Indicates that all the users can modify the all the items
2- Indicates the users can modify the items that they create
4 - Users cannot modify any list item
The patterns and practices for developing sharepoint applications has been released. This is aimed at architects and developers to aid the sharepoint development. It has One reference implementation addresses basic issues such as creating lists and content types. The other addresses more advanced problems such as how to integrate line of business services, how to create collaboration sites programmatically, and how to customize aspects of publishing and navigation. A library of reusable components helps you adopt techniques used in the reference implementations. The guidance discusses approaches for testing SharePoint applications, such as how to create unit tests, and documents experiences with stress and scale testing one of the reference implementations.

What is a custom tool part ?
The Custom tool part is part of the web part infrastructure, that helps us to create a custom user interface for the web part properties that goes beyond the capabilities of the default property pane.
When do we need a custom tool part ?
Let's say, If we need to create a web part property of type dropdown, we need to create a custom tool part. This is not supported out-of-box in the web part framework. I've the similar requirement of creating a custom web part property of type drop-down, So i went ahead and implemented the custom tool parts. Here are the steps to create a custom tool part.
public class SampleToolPart : Microsoft.SharePoint.WebPartPages.ToolPart
{
//create an instance of the dropdown control to be used in the custom tool part
System.Web.UI.WebControls.DropDownList oDropDown = new System.Web.UI.WebControls.DropDownList();
// Reference to the parent web part
SampleWebPart oSampleWebPart = null;
On the constructor method of the tool part class, just set the title of the tool part. In this case i'm going to display the
vendor names to the user
So i naming the title as select a vendor.
public SampleToolPart()
{
// Set the title for the custom tool part
this.Title = "Select a Vendor";
}
protected override void CreateChildControls()
{
try
{
//Get the instance of the parent web part on which this tool part is to be hosted
oSampleWebPart = (SampleWebPart)ParentToolPane.SelectedWebPart;
//Get the instance of the current site collection
SPSite oSPSite = SPControl.GetContextSite(HttpContext.Current);
//Get the instance of the current site (spweb)
Guid currentsiteid = SPControl.GetContextWeb(HttpContext.Current).ID;
using (SPWeb oSPWeb = oSPSite.OpenWeb(currentsiteid))
{
In the following few lines of code, i'm reading the list of vendors from the sharepoint custom list 'VendorList' and binding it to the sharepoint custom tool part.
SPList oProviderMaster = oSPWeb.Lists["VendorList"];
foreach (SPListItem oSPListItem in oProviderMaster.Items)
{
string sProviderName = oSPListItem["VendorName"].ToString();
oDropDown.Items.Add(sProviderName);
}
}
// Add the dropdown to the actual toolpart controls
this.Controls.Add(oDropDown);
base.CreateChildControls();
}
catch (Exception ex)
{
}
}
When the user choses the item from the dropdown of the custom tool part and clicks 'Apply Changes', grab the selected item from
the dropdown list and assign this value to a public property declared in the parent web part, where the tool part is hosted.
public override void ApplyChanges()
{
try
{
if (!(oDropDown.SelectedItem == null))
{
oSampleWebPart.SelectVendor = oDropDown.SelectedValue;
}
}
catch (Exception ex)
{
//handle exceptions here
}
}
}
There is a requirement to render the publically available web site content inside SharePoint application pages, dynamically based on arbitrary condition. This can be done in two ways. The first option is to use the page viewer web part and dynamically set the url of page viewer using a user control tied to the master page. The second option is to design an application page and render the external content using IFrames. The option of application pages + Iframes is better compared to dynamic page viewer web part way, considering many pros and cons.
The best way to achieve this to have an ASP.NETuser control that hosts the IFrame. Then host the entire user control inside the application page. Because user control gives the more control and flexibility to manipulate the properties of Iframes at run-time, than finding the logical event of ASP.NET page life-cycle and accomplish this task.
. On the page load of user control, add the src property of the user control
protected void Page_Load(object sender, EventArgs e)
{
this.IFrame1.Attributes.Add("src", ThirdPartyUrl);
}
The initial list of sessions for SharePoint Conference 2009 to be held in October 2006 at LasVegas is announced. Here is the initial list of session and topics :-
- SharePoint 2010 Overview and What's New
- Upgrading to SharePoint 2010
- SharePoint 2010 Capacity and Performance Planning
- SharePoint 2010 Security and Identity Management: What's New
- Visual Studio 2010 Tools for Office Development
- SharePoint 2010 Ribbon, ECMAScript and Dialog Framework Development
- Developing with REST and LINQ in SharePoint 2010
- Upgrading SharePoint Server 2007 Code to SharePoint 2010
- Building Composite Applications with the Microsoft Application Platform
- What's New in Business Connectivity Services (The Business Data Catalog Evolves!)
- FAST Search for SharePoint – Capabilities Deep Dive
- Advanced Dashboard Creation with Performance Point Services for SharePoint 2010
- Overview of Visio and Visio Services for SharePoint 2010
- SharePoint 2010 Web Content Management Deep-Dive
We may get more updated sessions down the line.
I've seen a question on MSDN forum on how to programmatically find the administrator of a site-collection. Here is the answer for that. The following snippet helps us to programmaticaly find administrator of a site-collection.
1: SPSite oSPSite = new SPSite(http://servername/sites/);sitecollectionname
2: SPWeb oSPWeb = oSPSite.OpenWeb();
3: SPUserCollection oUserCollection = oSPWeb.AllUsers;
4:
5: foreach (SPUser oSPUser in oUserCollection)
6: {
7: if (oSPUser.IsSiteAdmin == true )
8: {
9:
10: string email = oSPUser.Email;
11: string userid = oSPUser.ID.ToString();
12:
13: }
14:
15: }
Microsoft is providing a 10% discount on Microsoft Certified Technical Specialist (MCTS), Microsoft Certified IT Professional (MCITP) or Microsoft Certified Professional Developer (MCPD) exams.
Register today with your MVP Certification Promotion Code and enjoy 2 chances to pass a Microsoft Certification Examination* plus a 10% discount! If you fail on your first attempt, you will receive a free retake of the same exam (both exams must be taken by May 31, 2009)**!
Your Unique MVP Certification Promotion Code: IN0E9D9F
From now till March 31, 2009, the microsoft community members can key in the above MVP Promotion Code at www.learnandcertify.com to obtain a Microsoft Certification Exam Voucher Code at a 10% discount and free retake offer.
Note:-
The Exam Voucher Code is valid for exams taken by May 31, 2009 in India. Note that the limited time offer is valid for Microsoft Certified Technology Specialist (MCTS), Microsoft Certified IT Professional (MCITP) and Microsoft Certified Professional Developer (MCPD) exams only. More information on how to obtain the vouchers and the Terms & Conditions of Usage are available to your community at www.learnandcertify.com.
Dave Mann, SharePoint workflow guru has published a good article on sharepoint workflow performance. Please check this out:-
http://msdn.microsoft.com/en-us/library/dd441390.aspx
More Posts
Next page »