 <?xml-stylesheet type="text/css" href="https://i7media.com/Data/style/rss1.css" ?> <?xml-stylesheet type="text/xsl" href="https://i7media.com/Data/style/rss1.xsl" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <channel>
    <title>Blog</title>
    <link>https://i7media.com/blog</link>
    <description />
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>mojoPortal Blog Module</generator>
    <language>en-US</language>
    <ttl>120</ttl>
    <atom:link href="https://i7media.com/Blog/RSS.aspx?p=50~99~-1" rel="self" type="application/rss+xml" />
    <itunes:owner />
    <itunes:explicit>no</itunes:explicit>
    <item>
      <title>Stop Cyberattacks Before They Start: Secure Passphrases and MFA for Your Business</title>
      <description><![CDATA[<h3>Why Do You Need&nbsp;Secure Passphrases and Multifactor Authentication (MFA)?</h3>

<p>Most security breaches don't start with some elaborate hack. They start with a weak password.</p>

<p>Small and mid-sized companies&nbsp;are especially vulnerable targets because attackers know many organizations are still relying on simple, reused, or predictable passwords. It only takes a one compromised login to open the door to email accounts, cloud systems, financial data, or customer information.</p>

<p>i7MEDIA can help companies&nbsp;close the door with smarter login practices--specifically secure passphrases and multifactor authentication (MFA).</p>

<h3>What's Wrong&nbsp;with Traditional Passwords?</h3>

<p>Passwords like 123456 or Password1 are still incredibly common.&nbsp;Even passwords that look more complex can often be cracked quickly using automated tools. Today's attackers don't sit there guessing manually--they use software that can test thousands&nbsp;or even millions&nbsp;of combinations in minutes.</p>

<p>Once a hacker gains access, the consequences can be tremendous: ransomware infections, data breaches, wire fraud, or stolen customer records. In many cases, the initial entry point was nothing more than a weak or reused password. There have been cases where it has cost a company thousands of dollars to regain access to their systems, files, and/or records.</p>

<h3>Why Passphrases Work Better</h3>

<p>A passphrase is different from a typical password. Instead of a short string of characters, it's a longer combination of unrelated words, numbers, and symbols that's easy for you to remember but extremely difficult for a computer to guess.</p>

<p>For example:</p>

<ul>
	<li>Weak password:<strong>&nbsp;</strong>Summer2026!</li>
	<li>Strong passphrase:<strong>&nbsp;</strong>BlueCactus!Drives3Moons</li>
</ul>

<p>When thinking security here, longer is better. A longer&nbsp;passphrase, it increases the complexity dramatically, making brute-force attacks far less effective. And because passphrases tend to be more memorable, people are less likely to write them down or reuse them somewhere else.</p>

<h3>MFA is NON-NEGOTIABLE</h3>

<p>Even the best passphrase may not be enough.&nbsp;That's where&nbsp;multifactor authentication (MFA), sometimes called&nbsp;two-factor authentication, comes in. MFA requires at least two forms of verification before access is granted. Typically, that includes:</p>

<ol>
	<li>Something you know (your passphrase)</li>
	<li>Something you have (a smartphone app or security token)</li>
	<li>Something you are (biometrics like fingerprints or facial recognition)</li>
</ol>

<p>If a password is stolen in a phishing attack or data breach, MFA acts as a second lock on the door. Without that second factor, the hacker can't get in. It is one of the most effective and affordable ways to reduce unauthorized access.</p>

<h3>Making MFA and Passphrases Practical for Your Team</h3>

<p>Security only works if people actually use it. Rolling out passphrases and MFA throughout your organization needs to be structured and well managed.</p>

<p>A Managed&nbsp;Services Provider (MSP) can help by:</p>

<ul>
	<li>Enforcing MFA across email, cloud platforms, VPNs, and internal systems</li>
	<li>Help create clear polices around passphrase standards</li>
	<li>Train employees on how to build secure but memorable credentials</li>
	<li>Monitor for compromised accounts and respond quickly</li>
</ul>

<p>The goal isn't to make life harder for your team, it's to make your environment significantly harder for attackers.</p>

<h3>Take the First Step</h3>

<p>Cyberattacks are not just a distant possibility anymore--they're a routine part of doing business online. Strengthening your login security is one of the simplest and highest-impact changes you can make.</p>

<p>i7MEDIA, focuses on practical, proactive cybersecurity that protects your business without slowing it down. If you're ready to move beyond weak passwords and put real safeguards in place, now is the time to start, and we can help.</p>
<br /><a href='https://i7media.com/blog/stop-cyberattacks-before-they-start-secure-passphrases-and-mfa-for-your-business'>Phillip Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/blog/stop-cyberattacks-before-they-start-secure-passphrases-and-mfa-for-your-business'>...</a>]]></description>
      <link>https://i7media.com/blog/stop-cyberattacks-before-they-start-secure-passphrases-and-mfa-for-your-business</link>
      <author>phillip@i7media.net (Phillip Davis)</author>
      <comments>https://i7media.com/blog/stop-cyberattacks-before-they-start-secure-passphrases-and-mfa-for-your-business</comments>
      <guid isPermaLink="true">https://i7media.com/blog/stop-cyberattacks-before-they-start-secure-passphrases-and-mfa-for-your-business</guid>
      <pubDate>Mon, 23 Mar 2026 14:03:00 GMT</pubDate>
    </item>
    <item>
      <title>Software Architecture Patterns: A Time and Place for Everything</title>
      <description><![CDATA[<p>Software architectural patterns are one of the more polarizing and controversial topics in the development world.</p>

<p>"Here's all the patterns that every project needs!"</p>

<p>"All patterns are bad and you should feel bad if you use them!"</p>

<p>In this post I will talk about what Architectural Patterns are, when they matter, when to use them and when not to.</p>

<p>I will list out a few patterns in a way that I hope will share understanding rather than dogmatic positions that are often held by tech influencers on social media.</p>

<h2>What Are Architectural Patterns?</h2>

<p>An architectural pattern is a solution to a specific problem that arises in the design of a project. They come in the form of separating concerns, grouping functionality, abstracting implementation details, and dictating conventions for the team to use.</p>

<p>Patterns can be as simple as breaking features into predictable functions, or to complex layers that handle a multitude of use cases.</p>

<h2>When Should One Use Patterns?</h2>

<p>When you find your code being hard to navigate, disorganized, difficult&nbsp;to maintain, or having&nbsp;trouble&nbsp;on-boarding new developers, using patterns can make some sense of the chaos.</p>

<p>If you find that your project has a problem, sometimes a pattern will resolve your problem. If your project doesn't have the problem that the pattern addresses, or if you don't understand what problem the pattern address, don't use the pattern.</p>

<p>It's as simple as that.</p>

<p>After 16 years of experience with many CMSs (Content Management Systems), I have found that they benefit greatly from Architectural Patterns, or that the lack of patterns can hinder growth and modernization over the years.</p>

<p>Of all the CMSs I have experience with, mojoPortal is the one I know most about, is dearest to my heart, and the CMS that I will use to showcase&nbsp;my position on&nbsp;patterns.</p>

<h2>"I Don't Feel Like I Need Patterns"</h2>

<p>This is a good indicator that you don't need patterns. If you are a solo developer, are in a small team, or it's just a side project, there might not be a need for you to even consider a pattern.</p>

<p>If you have a project that later in its lifetime you feel like you would benefit from a pattern, refactoring is always an option.</p>

<h2>What are Common Patterns and the Problems They Solve?</h2>

<p>There are so many that I couldn't possibly list them, but I'll list a few I've had experience with, and some that I believe to have value in the CMS realm.</p>

<h3>Layered (N-Tier) Architecture</h3>

<p class="image-center"><img alt="" height="333" src="https://i7media.com/Data/blogs/software-architectural-patterns/application-layers.png" width="600" /></p>

<p>If you're familiar with mojoPortal, it mostly implements this pattern.</p>

<p>The idea behind this pattern is to separate functionality concerns into these project layers:</p>

<p>The <strong>Data Access Layer</strong> holds all implementation code for storing and manipulating data. It becomes the only API for the application to interface with your data, be it from a file, a database engine, or another system.</p>

<p>The <strong>Business Layer</strong> is the only layer that references the Data Access Layer. It holds domain entities (classes that represent tables in a database for instance) and the logic to bring the data together in code representations of the application features.</p>

<p>The <strong>Presentation (Web) Layer</strong> is the only layer that references the Business Layer. This layer is for "presenting" the features in the application. It could be a Windows Application or a Web Application, but the main thing it does is give a user interface to the code features from the Business layer.</p>

<p>The reason I said mojoPortal "mostly" implemented this pattern is because while the project is split into the proper layers, a lot of the business logic wound up in the Web (Presentation) Layer. This has made it very difficult to attempt to migrate away from the Web Forms framework it was built on to a more modern and capable framework.</p>

<p>The pros of this pattern are everything is grouped in a logical fashion and you know where everything belongs.</p>

<p>The cons of this pattern are that every layer is tightly coupled to the previous layer. This can be difficult later down the road when replacing dependencies or dealing with providers for services throughout the application. This leads into the next pattern.</p>

<h3>Clean Architecture</h3>

<p class="image-center"><img alt="" height="547" src="https://i7media.com/Data/blogs/software-architectural-patterns/clean-architecture.png" width="550" /></p>

<p>The purpose of this pattern is much like the previous pattern, but with some tweaks and the implementation of another pattern to facilitate changes to make up for the previous pattern's downfalls.</p>

<p>Much like the Layered Architecture pattern, the application is separated into several projects.</p>

<p>It differs on some key points.</p>

<ol>
	<li>All interaction between layers is done through the use of&nbsp;contract interfaces.<br />
	What this means is unlike layered architecture, instead of directly referencing the implementation of a service, you reference the interface the service implements. This allows for easily swapping out the implementation if needed.</li>
	<li>The layer references are moved around a bit. Rather than each project pointing to the previous project, the projects are placed in an encircling shape, all pointing inward or towards each other in their layer.</li>
</ol>

<p>The Layers are as such:</p>

<p>The <strong>Domain Layer</strong> is the ultimate authority of the entire application. It contains all the domain concerns and contracts for the application with no references to any internal or external dependencies. All other layers can use this layer. This layer is often coupled with the Domain Driven Design pattern, but it's not required.</p>

<p>The <strong>Application Layer</strong> contains the business logic of the application and the contract interfaces that are to be implemented in the Infrastructure layer. Often times this is where the CQRS and/or Vertical Slice patterns are used, but it's not required.</p>

<p>The <strong>Infrastructure Layer</strong> is where all implementations for the contracted services in the Application are kept. All external dependencies/libraries are abstracted here, allowing for easy replacement from one library to another if needed. An example would be if your project started by supporting SQL Server but later a migration to PostgreSQL was in order, the only assembly that would need to be edited or replaced would be the Infrastructure assembly.</p>

<p>Sometimes the Infrastructure Layer will break out only the database concerns into its own Persistence Layer(s), keeping the database specific code in it's own layer(s), but this is not required.</p>

<p>The <strong>Presentation Layer</strong> brings everything together through the use of the Inversion of Control Pattern. This allows each layer to register services in the IoC container using the interface contracts and keeping the implementation details hidden from the application. The IoC container handles the dependencies for all services that are registered to it, allowing the system to keep track of lifecycles and dispose of objects so that the implementation reference is kept in one location.</p>

<p>A cool thing about Clean Architecture is that one could have multiple Presentation Layers but share all the core functionality from the Application Layer. Do you need a multi-page website but want to administrate it through a mobile app? The answer could be two Presentation Layers, an MVC/Razor Pages layer for the website, and a Web API layer in conjunction with the mobile app for administration.</p>

<p>The pros of this pattern are that it's incredibly versatile while enforcing strict separation of concerns and external dependencies allowing for a very long-lived application.</p>

<p>The cons of this pattern are that it's moderately complicated, where boilerplate could become monotonous if the application doesn't need to use the pattern.</p>

<p>mojoPortal would have benefited a lot from this pattern being implemented properly, as migrating&nbsp;to .NET (Core) from .NET Framework would have consisted of replacing the Infrastructure layer using the same Application Layer contracts, and rebuilding the Presentation Layer in a .NET (Core) UI framework. The majority of the application wouldn't change.</p>

<p>More Reading:</p>

<ul>
	<li><a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html">The Clean Architecture - The Clean Code Blog [Uncle Bob]</a></li>
	<li><a href="https://medium.com/@rudrakshnanavaty/clean-architecture-7c1b3b4cb181">Clean Architecture - Medium</a></li>
	<li><a href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain-driven Design - Wikipedia</a></li>
</ul>

<h4>The Repository and Unit of Work Patterns</h4>

<p>The Repository pattern is an excellent pattern for data access. The Unit of Work pattern compliments the Repository pattern by allowing for bundles transactions for data integrity.</p>

<p>The Repository pattern's goal is to abstract repeated logic for data manipulation and querying. It allows you to have a single "GetById" method that works for all tables with the code being written once. It keeps your code DRY and makes it easy to do things like adding global query filters for features like soft deletion.</p>

<p>The Unit of Work pattern creates a "unit of work" for each action you take when mutating data. If you need to save a blog post, but it needs a new category that does not exist, the UoW will prevent bad data from being saved if creating the category fails by not saving the blog post. It's an interface for database transactions, if you're familiar with how those work.</p>

<p>Some people raise issue to the Repository (and Unit of Work) pattern when using Entity Framework, as Entity Framework implements its own versions of those patterns. This is&nbsp;completely understandable for application that will realistically never wish to change the library that connects to the database. However, from experience, I would rather have everything in my application have its own contracts to facilitate that possibility of change.</p>

<p>mojoPortal's Data Access layers all use ADO.NET, and their contracts are the implementations, which has made changing to something like Entity Framework for easy migrations and multiple database providers very hard. If the Repository pattern was between the layers, replacement would be a much more feasible.</p>

<p>More Reading:</p>

<ul>
	<li><a href="https://deviq.com/design-patterns/repository-pattern">Repository Pattern - DevIQ</a></li>
	<li><a href="https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application">Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application - Microsoft</a></li>
</ul>

<h4>The Query Specification Pattern</h4>

<p>The Query Specification pattern is another pattern used in tandem with the repository pattern. It allows us to create domain level specifications that we can use in the Application Layer without having to expose an implementation's API.</p>

<p>For instance, we can create a "GetBookWithAuthors" specification that just takes a Book ID, and pass the specification to the Repository's "FirstOrDefaultAsync" method that&nbsp;will be sure that&nbsp;the underlying data access code will return the appropriate Book with Authors for that book.</p>

<p>More Reading:</p>

<ul>
	<li><a href="https://medium.com/@cizu64/the-query-specification-pattern-in-ddd-net-core-25f1ec580f32">The Specification Pattern in DDD .NET Core - Medium</a></li>
	<li><a href="https://deviq.com/design-patterns/specification-pattern">Specification Pattern - DevIQ</a></li>
</ul>

<h4>Plugin Architecture Pattern</h4>

<p>The Plugin Architecture Pattern&nbsp;is a pattern that facilitates the ability to add or change functionality of the application with the use of third party bundled code. Most CMSs support this pattern, mojoPortal has its own way of handling modules (plugins) that achieve the same goal.</p>

<p>It's quite simple, the main application provides a set of APIs (the Plugin Interface) that a plugin developer can implement in their plugin, and then register their code with the Plugin Manager, which is responsible for loading and running the Plugin code.</p>

<p>More Reading:</p>

<ul>
	<li><a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Create a .NET Core application with plugins - Microsoft</a></li>
	<li><a href="https://blog.nashtechglobal.com/plugin-architecture-pattern-overview-net/">Plugin Architecture Pattern Overview (.NET) - Nash Tech</a></li>
</ul>

<h3>Bringing it all Together</h3>

<p>By using the Clean Architectural pattern, we have a good foundation to allow us to plug and play any&nbsp;implementations through the use of contract interfaces and Dependency Injection. In the event that the database code needs to be swapped out, a third party library needs to be replaced due to a security vulnerability, or having the ability to provide different implementations for selection through the application's settings, this will help facilitate these use cases.</p>

<p>Using the Repository, Unit of Work, and Query Specification&nbsp;patterns we can prevent repeating code for querying data&nbsp;and we abstract away data query implementation, and it allows us to support or swap database providers at runtime.</p>

<p>The Plugin pattern allows for us to expand the application in any way that is needed. Be it adding new features (Blog, Forums, Event Calendar, CRM, etc.)&nbsp;or modifying an existing feature (swapping out authentication methods, listening for events to modify data, etc.) it makes the application as flexible as possible.</p>

<h3>Conclusion</h3>

<p>These are what I believe are the foundational building blocks for&nbsp;a CMS like the next version of mojoPortal could use, and who knows? I might be doing just that. 😉</p>

<p>Does that mean that all applications should use Clean Architecture or the Repository patterns?&nbsp;Clearly not.</p>

<p>Patterns are like shoes, if they fit and do the job that you have a need for, use them, otherwise don't.&nbsp;Just don't make the mistake that if your application doesn't need&nbsp;patterns that&nbsp;no one needs&nbsp;patterns, as many people on the internet so readily declare.</p>
<br /><a href='https://i7media.com/blog/software-architecture-patterns-a-time-and-place-for-everything'>Elijah Fowler</a>&nbsp;&nbsp;<a href='https://i7media.com/blog/software-architecture-patterns-a-time-and-place-for-everything'>...</a>]]></description>
      <link>https://i7media.com/blog/software-architecture-patterns-a-time-and-place-for-everything</link>
      <author>elijah@i7media.net (Elijah Fowler)</author>
      <comments>https://i7media.com/blog/software-architecture-patterns-a-time-and-place-for-everything</comments>
      <guid isPermaLink="true">https://i7media.com/blog/software-architecture-patterns-a-time-and-place-for-everything</guid>
      <pubDate>Tue, 24 Feb 2026 17:24:00 GMT</pubDate>
    </item>
    <item>
      <title>CSS Features: Easy Styling of Select Elements!</title>
      <description><![CDATA[<p>There are a whole host of new and exciting CSS features that were rolled out in 2025,&nbsp;many of which are supported by the latest editions of Chromium browsers already in 2026. A list of these new features are described in the <a href="https://chrome.dev/css-wrapped-2025/">CSS Wrapped 2025</a> article by the Chrome dev team.</p>

<p><b>A Brief Look At New Features</b></p>

<table class="table table-bordered table-striped">
	<thead>
		<tr>
			<th><strong>Feature</strong></th>
			<th><strong>Description</strong></th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td><code>appearance:&nbsp;base-select</code></td>
			<td>Enables the new&nbsp;<code>&lt;select&gt;</code>&nbsp;styling options</td>
		</tr>
		<tr>
			<td><code>select::picker(select)</code></td>
			<td>Pseudo-element for the dropdown surface of a <code>&lt;select&gt;</code>&nbsp;that has base-select enabled</td>
		</tr>
		<tr>
			<td><code>.selectedcontent</code></td>
			<td>CSS Selector for the currently selected option in the <code>&lt;select&gt;</code></td>
		</tr>
		<tr>
			<td><code>sibling-index()</code></td>
			<td>Represents a the position of an element among its sibling elements</td>
		</tr>
		<tr>
			<td><code>sibling-count()</code></td>
			<td>Represents the total number of sibling elements</td>
		</tr>
		<tr>
			<td><code>attr()</code></td>
			<td>Lets you use the value of an HTML attribute within your CSS</td>
		</tr>
		<tr>
			<td><code>@starting-style</code></td>
			<td>Defines styles for the start of a transition or animation</td>
		</tr>
		<tr>
			<td><code>::scroll-button()</code></td>
			<td>Pseudo-element representing a button that scrolls the container when clicked</td>
		</tr>
		<tr>
			<td><code>::scroll-marker</code></td>
			<td>Pseudo-element associated with each scroll item for use as pagination</td>
		</tr>
		<tr>
			<td><code>::scroll-marker-group</code></td>
			<td>Wrapper for the generated <code>::scroll-marker</code>&nbsp;set to help you position them</td>
		</tr>
		<tr>
			<td><code>scroll-target-group</code></td>
			<td>Attribute that enables CSS to match which link's target is currently in view (see&nbsp;<code>:target-current</code>&nbsp;below)</td>
		</tr>
		<tr>
			<td><code>:target-current</code></td>
			<td>Selector that matches a target element whose anchor is the currently scroll-active element</td>
		</tr>
		<tr>
			<td><code>container-type:&nbsp;scroll-state</code></td>
			<td>Enables CSS to react to whether a container is in a specific scroll state</td>
		</tr>
	</tbody>
</table>

<h3>Simple, Beautiful Select Elements in 2026</h3>

<p>Today we'll be looking primarily at the new options for <code>&lt;select&gt;</code> elements and how they give developers much more control over the element and remove the need for unwieldy JavaScript solutions that would often be used to bring drop-down boxes into alignment with the rest of a site's theme. Many JS solutions that have been popularized over the years are either so heavy that they become&nbsp;a problem for optimization (especially an issue for mobile users),&nbsp;or so light that they didn't properly handle all of the native functionality of a <code>&lt;select&gt;</code> element resulting in lost accessibility functionality.</p>

<p>The browser's in-built <code>&lt;select&gt;</code> element automatically handles many necessary functions for mobile responsiveness, ensuring the drop-down is visible either above or below the element depending on the current view state when the element is interacted with, option readability and browsability via keyboard, alternative select views for small devices (such as the pop-up you get on many phones when pressing a select that is different from the fly-out you might get on a desktop), native indexing, and more. Replacing all of these features with JavaScript just to make something look better has often been a painful choice for developers, because allowing a whole component to just not match the rest of your styles can make your product seem cheap, but having a heavy script to handle all of these features (and making sure that script stays up to date with modern browser features over time) is a high price to pay for appearances.</p>

<p>So it's really good news that this problem is being addressed in CSS itself! Let's look at what can be done with the new features. First, we need to enable the new features with CSS like so:</p>

<pre class="language language-css">
<code>@supports(appearance: base-select) {
	select,
	select::picker(select) {
		appearance: base-select;
	}
}</code>
</pre>

<p>This CSS simply enables the new features on your <code>&lt;select&gt;</code> element, and the dropdown <code>::picker</code> pseudo-element. By default this is a progressive enhancement because browsers which don't support <code>appearance: base-select;</code> yet will simply ignore your styling of the pseudo-elements. If you want to make changes to your select elements directly and worry about any damage that might cause to older browsers, you can be extra safe by including the @supports query as we show here.</p>

<p>Once you've enabled the new features, you can style the <code>::picker</code> pseudo-element just like you would any other element. Check out some of what we can do in this codepen.</p>

<p class="codepen" data-default-tab="html,result" data-height="500" data-pen-title="Untitled" data-slug-hash="XJKVzNY" data-theme-id="dark" data-user="Isaac-Hall" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;"><span>See the Pen <a href="https://codepen.io/Isaac-Hall/pen/XJKVzNY"> Base-Select Feature Fun</a> by Isaac Hall (<a href="https://codepen.io/Isaac-Hall">@Isaac-Hall</a>) on <a href="https://codepen.io">CodePen</a>.</span></p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

<p style="margin-top: 15px;">We have total control over the dropdown just like we would if we created our own in HTML and used JavaScript to make it function, but this time all the functionality is already handled by the browser, and our code remains completely accessibility-compliant with no extra work. We can add images, extra elements, descriptions, and anything else we like to the select options and control their display with CSS.</p>

<p>As an added bonus, we used the new <code>sibling-index()</code> feature inside our animation delay to cause each option to fade in at a different speed based on its index in the <code>&lt;select&gt;</code>.</p>

<pre class="language language-css">
<code>option {
	transition: opacity 200ms ease, translate 500ms ease;
	transition-delay: calc(200ms * (sibling-index() - 2));

	@starting-style {
		opacity: 0;
		translate: 15px 0;
	}
}</code>
</pre>

<p>Using sibling-index() in a transition delay lets each element get a different delay because they are all at a different index, creating a nice swinging-in effect when the select is opened. There are probably a million better ways to use this feature, but this gets the point across. Note that we arbitrarily offset the index by -2 because we don't want it to count the base <code>&lt;button&gt;</code> element or the first default <code>&lt;option&gt;</code> siblings, so we just subtract them from the count on each option.</p>

<p>Considering all these fantastic tools that were rolled out in 2025, we're excited to see what comes along in 2026.</p>

<p class="alert alert-warning"><b>Note:</b> The CSS features described in this blog were not fully supported in all browsers at the time this post was written. Consider checking in with <a href="https://caniuse.com/mdn-css_properties_appearance_base-select" target="_blank">caniuse.com</a> before using them in production environments.</p>
<br /><a href='https://i7media.com/blog/css-features-easy-styling-of-select-elements'>Isaac Hall</a>&nbsp;&nbsp;<a href='https://i7media.com/blog/css-features-easy-styling-of-select-elements'>...</a>]]></description>
      <link>https://i7media.com/blog/css-features-easy-styling-of-select-elements</link>
      <author>isaac@i7media.net (Isaac Hall)</author>
      <comments>https://i7media.com/blog/css-features-easy-styling-of-select-elements</comments>
      <guid isPermaLink="true">https://i7media.com/blog/css-features-easy-styling-of-select-elements</guid>
      <pubDate>Tue, 27 Jan 2026 22:45:00 GMT</pubDate>
    </item>
    <item>
      <title>i7MEDIA Acquires Microquiz</title>
      <description><![CDATA[<p><strong>Media wishing to learn more about this event, please use the <a href="https://i7media.com/contact-us">Contact Form</a> on this site.</strong></p>

<p><strong>FOR IMMEDIATE PUBLIC RELEASE:</strong></p>

<p><strong>Microquiz Limited, a website development and hosting company based in Coventry, England&nbsp;and i7MEDIA, an IT Services agency based in Excelsior Springs, Missouri, USA, have entered into an agreement for i7MEDIA to begin servicing Microquiz clients.</strong></p>

<p><strong>Excelsior Springs, Mo (October 30,&nbsp;2024)</strong> - It is an exciting day for i7MEDIA, a longtime provider of mojoPortal development and support services to Microquiz, has entered into an agreement to acquire and service all customers of Microquiz Limited.&nbsp;</p>

<p>Microquiz has used mojoPortal relied upon i7MEDIA's expertise for building and supporting hundreds of mojoPortal websites over the past decade. Their services include domain registration, website and email hosting, website design, and content management.&nbsp;</p>

<p>With this acquisition, Microquiz customers will enjoy the full depth of i7MEDIA's proven model for providing great customer support and affordable, comprehensive IT Services. i7MEDIA will be migrating customers to their private cloud service, which will improve security and performance while offering new services and greater control for customers.</p>

<p>i7MEDIA was founded in 2008 as a website design and hosting company and built a portfolio of clients on every continent. Since then, it has&nbsp;expanded its service offerings to include application and database development, cloud provider support services, and managed IT services. i7MEDIA's growth in recent years is attributed to its dedication to building strong relationships with its clients. &nbsp;</p>

<p><span style="letter-spacing: 0.2px;">Microquiz customers should <a href="https://i7media.com/contact-us/">contact i7MEDIA</a> with any questions they may have.</span></p>
<br /><a href='https://i7media.com/blog/i7media-acquires-microquiz'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/blog/i7media-acquires-microquiz'>...</a>]]></description>
      <link>https://i7media.com/blog/i7media-acquires-microquiz</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/blog/i7media-acquires-microquiz</comments>
      <guid isPermaLink="true">https://i7media.com/blog/i7media-acquires-microquiz</guid>
      <pubDate>Wed, 30 Oct 2024 21:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Ensuring Inbox Success</title>
      <description><![CDATA[<p>Ensuring the emails our customers send are actually delivered to their recipients is one of our top priorities. We are always watching our email systems and evaluating ways to ensure our clients receive the absolute best email delivery rates possible.</p>

<p>Recently, two of the world's largest email providers, Google and Yahoo, announced they will soon require email senders to comply with more stringent email authentication policies—senders not in compliance&nbsp;with the new requirements will see issues getting their emails delivered in 2024.</p>

<p>The good news is that for the vast majority of i7MEDIA customers, there's nothing anyone needs to do to ensure emails are delivered to Google and Yahoo once these rules take effect. We've already been compliant with the rules for years.&nbsp;Additionally, we welcome these new requirements because we have tried to enforce them on emails being sent to our customers in the past but have not been able to because the "big guys" weren't doing it causing our customers to believe our systems weren't working properly. So, we're pretty excited about these changes as they will help us protect our customers Inboxes.</p>

<h2>Google and Yahoo have good reason to change&nbsp;the rules for email senders</h2>

<p>Properly authenticating emails has been a best practice for a long time, but most&nbsp;providers haven't bothered to ensure their services are using the tools available to protect their emails. That’s a major problem: If emails aren't properly authenticated, it is incredibly easy for bad actors to impersonate domains and to send phishing attacks—that will damage an entire domains sending reputation.</p>

<p>We are focused on protecting our users from spam and unwanted emails, but if other senders fail to properly secure their systems and leave their customers wide open to exploitation, that job is incredibly difficult. Gmail and Yahoo have finally decided that proper email authentication and following deliverability best practices are no longer a nice-to-have (THANK YOU!). To ensure our clients emails continue to make it to the inbox, we have to comply with key best practices for email authentication and spam prevention. That means:</p>

<ol>
	<li>
	<p><strong>Authenticating your emails using DKIM, SPF, and DMARC.</strong></p>
	</li>
	<li>
	<p><strong>Reducing spam and maintaining a spam complaint rate under 0.3%.</strong></p>
	</li>
	<li>
	<p><strong>Allowing people to unsubscribe by clicking just one link</strong>, and honor unsubscribes within two days.&nbsp;<br />
	<em>We handle this automatically for our customers on our "professional" email service plans.</em></p>
	</li>
	<li>
	<p><strong>RFC 5322 compliance, PTR records, rDNS</strong><br />
	<em>We have&nbsp;our customers covered here.</em></p>
	</li>
	<li>
	<p><strong>Making sure your sending server IP addresses have&nbsp;valid reverse DNS records.</strong><br />
	<em>We have our customers covered here.</em></p>
	</li>
	<li>
	<p><strong>Use a TLS connection for transmitting email.</strong><br />
	<em>We have supported <a href="https://en.wikipedia.org/wiki/Opportunistic_TLS" target="_blank">opportunistic TLS</a>&nbsp;for all outbound email since we first started hosting email, ensuring messages are encrypted in transit.</em></p>
	</li>
</ol>

<h2>These changes benefit all of us</h2>

<p>While these new requirements primarily target large&nbsp;<em>bulk</em>&nbsp;senders (many requirements&nbsp;will only apply to high-volume senders who send more than 5,000 emails a day). For smaller senders (most of our clients) sending mostly&nbsp;transactional email (not newsletters), there is less of a chance you're going to be impacted by the changes—but you can't&nbsp;<em>ignore</em>&nbsp;them.</p>

<p>We know from experience that these requirements will likely apply to all senders in the future. Besides, who would want to run their business in a&nbsp;"sort of compliant” and haphazard manner?&nbsp;</p>

<p>So, whether our clients send just a few emails a day&nbsp;or a few million an hour, protecting their domains, avoiding spam, and following deliverability standards is top priority for us to keep our clients safe and their email delivered reliably.</p>

<h2>What our clients can expect</h2>

<p>For most of our clients, you can just expect to have your email delivered as always. For some, you will hear from us asking you to create some DNS records (DKIM, DMARC, SPF) or give us temporary access so we can create these records. That's it. We'll handle the rest and that's not much because we've always done this for customers who host their DNS with us and we've always tried to get it done for those who do not.</p>

<p>If you have any trouble with your email or questions about this article and the new requirements, please <a href="https://i7media.com/contact-us">contact us</a> as we'd be very happy to help you out. If your email provider isn't responsive, hasn't bothered implementing these changes, or&nbsp;doesn't have U.S.-based support, those are all really good reasons to give us a <a href="https://i7media.com/contact-us">shout</a>!&nbsp;</p>
<br /><a href='https://i7media.com/blog/ensuring-inbox-success'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/blog/ensuring-inbox-success'>...</a>]]></description>
      <link>https://i7media.com/blog/ensuring-inbox-success</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/blog/ensuring-inbox-success</comments>
      <guid isPermaLink="true">https://i7media.com/blog/ensuring-inbox-success</guid>
      <pubDate>Mon, 13 Nov 2023 22:56:00 GMT</pubDate>
    </item>
    <item>
      <title>i7MEDIA Acquires Advertinet, Inc</title>
      <description><![CDATA[<p><strong>Media wishing to learn more about this event, please use the <a href="https://i7media.com/contact-us">Contact Form</a> on this site.</strong></p>

<p><strong>FOR IMMEDIATE PUBLIC RELEASE:</strong></p>

<p><strong>Advertinet, Inc., a website development and hosting company based in Carmi, Illinois and i7MEDIA, an IT Services agency based in Excelsior Springs, Missouri, have entered into an agreement for i7MEDIA to purchase Advertinet's assets and customer base.</strong></p>

<p><strong>Excelsior Springs, Mo (January 3,&nbsp;2023)</strong> - It is an exciting day for i7MEDIA, a longtime provider of hosting services to Advertinet, has completed the purchase of assets and customer base from Advertinet, Inc.&nbsp;</p>

<p>Joe Davis, i7MEDIA Managing Director, has worked with Sam Westgate, Advertinet President, since 2011 when Advertinet moved its hosting services under i7MEDIA's care. Since that time, i7MEDIA has provided development, design, and support services as well.</p>

<p>With this acquisition, Advertinet customers will enjoy the full depth of i7MEDIA's proven model for providing great customer support and affordable, comprehensive IT Services.</p>

<p>Over time we'll be migrating Advertinet's services to our own and we'll do this minimal downtime for all customers.&nbsp;Advertinet customers will see a marked improvement in performance and, for email, a more modern webmail interface with new features, which will better support their businesses. We'll work directly with customers to ensure they do not experience any downtime and we'll train them on the new email system. Best of all, there will be no charge for these upgrades.&nbsp;</p>

<p>Advertinet customers should contact i7MEDIA with any questions they may have.</p>
<br /><a href='https://i7media.com/i7media-acquires-advertinet-inc'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/i7media-acquires-advertinet-inc'>...</a>]]></description>
      <link>https://i7media.com/i7media-acquires-advertinet-inc</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/i7media-acquires-advertinet-inc</comments>
      <guid isPermaLink="true">https://i7media.com/i7media-acquires-advertinet-inc</guid>
      <pubDate>Tue, 03 Jan 2023 15:40:00 GMT</pubDate>
    </item>
    <item>
      <title>Horizon Engineering Website</title>
      <description><![CDATA[<p>We are very proud to have created this beautiful new website for Horizon Engineering Associates! They have been a loyal i7MEDIA customer for over 10 years, and we happily continue to serve them with our managed hosting services and content management.&nbsp;<a href="https://www.horizon-engineering.com/">Check it out!</a>&nbsp;</p>
<br /><a href='https://i7media.com/projects/horizon-engineering-website'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/projects/horizon-engineering-website'>...</a>]]></description>
      <link>https://i7media.com/projects/horizon-engineering-website</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/projects/horizon-engineering-website</comments>
      <guid isPermaLink="true">https://i7media.com/projects/horizon-engineering-website</guid>
      <pubDate>Thu, 02 Jun 2022 16:49:00 GMT</pubDate>
    </item>
    <item>
      <title>Self-Evident Ministries</title>
      <description><![CDATA[<p>When Self-Evident Ministries reached out to our company with the hopes of rebuilding and revamping their website, we were happy to help! We are very excited to have developed and designed this new site, using nopCommerce and mojoPortal, into a more interactive platform.&nbsp;<a href="https://theselfevidenttruth.com/">Check it out!</a></p>
<br /><a href='https://i7media.com/projects/self-evident-ministries'></a>&nbsp;&nbsp;<a href='https://i7media.com/projects/self-evident-ministries'>...</a>]]></description>
      <link>https://i7media.com/projects/self-evident-ministries</link>
      <author>()</author>
      <comments>https://i7media.com/projects/self-evident-ministries</comments>
      <guid isPermaLink="true">https://i7media.com/projects/self-evident-ministries</guid>
      <pubDate>Thu, 26 May 2022 18:38:00 GMT</pubDate>
    </item>
    <item>
      <title>Wild Ginger Software, Inc.</title>
      <description><![CDATA[<p>We were very pleased when Wild Ginger asked us to build them a custom integration of their existing licensing software and nopCommerce, while being even more pleased to continue supporting them with our managed premium hosting services. <a href="https://wildginger.com">Check it out!</a></p>
<br /><a href='https://i7media.com/projects/wild-ginger-software-inc'></a>&nbsp;&nbsp;<a href='https://i7media.com/projects/wild-ginger-software-inc'>...</a>]]></description>
      <link>https://i7media.com/projects/wild-ginger-software-inc</link>
      <author>()</author>
      <comments>https://i7media.com/projects/wild-ginger-software-inc</comments>
      <guid isPermaLink="true">https://i7media.com/projects/wild-ginger-software-inc</guid>
      <pubDate>Tue, 24 May 2022 19:25:00 GMT</pubDate>
    </item>
    <item>
      <title>Grandma's Office Catering</title>
      <description><![CDATA[<p>We are very proud to have created this new site for Grandma's Office Catering! With the use of nopCommerce, this new site is easier to manage and more user-friendly. We continue to support Grandma's Office Catering by providing them with our managed premium hosting services. <a href="https://www.grandmascatering.com">Check it out</a>!</p>
<br /><a href='https://i7media.com/projects/grandmas-office-catering'></a>&nbsp;&nbsp;<a href='https://i7media.com/projects/grandmas-office-catering'>...</a>]]></description>
      <link>https://i7media.com/projects/grandmas-office-catering</link>
      <author>()</author>
      <comments>https://i7media.com/projects/grandmas-office-catering</comments>
      <guid isPermaLink="true">https://i7media.com/projects/grandmas-office-catering</guid>
      <pubDate>Tue, 24 May 2022 19:11:00 GMT</pubDate>
    </item>
    <item>
      <title>i7MEDIA purchases mojoPortal</title>
      <description><![CDATA[<script>
$(document).ready(function() {
					     $('[data-b64]').each(function() {
					          var b64 = $(this).data('b64')
					               oValue = window.atob(b64);
					          $(this).attr('href', 'mailto:' + oValue).html(oValue);
					     });
					});
</script>
<h5 class="AlignCenter"><strong>Media wishing to learn more about this event, please send all questions to <a data-b64="aGlAaTdtZWRpYS5uZXQ=">&nbsp;</a></strong></h5>

<p><strong>FOR IMMEDIATE PUBLIC RELEASE:</strong></p>

<p><strong>i7MEDIA has purchased mojoPortal and all of its commercial modules</strong></p>

<p><strong>Kearney, Mo (Feb 6,&nbsp; 2017)</strong> - It is an exciting day for the mojoPortal project! i7MEDIA, a longtime supporter of the mojoPortal project, has completed the purchase of the open source project and the commercial modules available on the mojoPortal website from Source Tree Solutions.</p>

<p>Joe Davis, i7MEDIA President, has been strong supporter of mojoPortal since 2008. Joe built his business around this versatile and user-friendly content management system. i7MEDIA, is dedicated to furthering the development of mojoPortal and its tools.</p>

<p>Rest assured mojoPortal will remain an open source project and there are no plans to change that. However, I7MEDIA has plans for expanding mojoPortal to help it stay relevant and provide the very best .NET CMS platform on the market today.&nbsp;</p>

<p>Joe Audette, of Source Tree Solutions, is very enthusiastic about the new life of mojoPortal:</p>

<blockquote>Joe Davis and i7MEDIA have always been the most qualified consultants for mojoPortal other than myself, and I've always had great confidence in referring customers and projects to them over the years.&nbsp; Joe Davis has been a good friend and has been my go to guy when I needed to refer a customer or project that I did not have the capacity for. Whether you need design help, hosting, or custom feature development, i7MEDIA is the team you want with years of experience. mojoPortal was my baby for over a decade, and I am very glad to know my baby is in good hands! Long live mojoPortal! <cite>Joe Audette, mojoPortal Founder</cite></blockquote>

<p>mojoPortal has always been easy for users to add and manage their content. Over the past few years, though, it has fallen behind other systems which have taken more modern approaches to management and more fully utilized the capabilities of modern browsers. i7MEDIA has developed add-on features for mojoPortal which make content management easier and they are working on packaging these features for the masses to use.</p>

<p>Development of add-ons for mojoPortal isn't necessarily hard but there is a bit of a learning curve and quite a few steps one must take to prepare a working development environment. The focus will be on cutting down on the number of steps and making the process easier overall. They will also explore possible MVC and WebApi implementations of some features, especially administration features like the File Manager.&nbsp;</p>

<p>It has always been possible to create beautiful sites with mojoPortal but the built-in skins were not good examples. i7MEDIA is working on providing newer skins to help showcase the power or mojoPotral. &nbsp;i7MEDIA is committed to making sure that mojoPortal is seen as a designer-friendly CMS.&nbsp;</p>

<p>A new version of mojoPortal is scheduled for release in the next couple of weeks with several small fixes, a few clean bootstrap-based skins and a brand-new file manager to replace both of the current file managers and the link and image picker used in the WYSIWYG editors. That's right, one file manager that does it all.&nbsp;</p>

<p>For the latest news, check out mojoPortal’s <a href="https://www.facebook.com/mojoPortal-146363180114/">Facebook</a> and <a href="https://twitter.com/mojoportal">Twitter</a> feeds.</p>
<br /><a href='https://i7media.com/i7media-purchases-mojoportal'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/i7media-purchases-mojoportal'>...</a>]]></description>
      <link>https://i7media.com/i7media-purchases-mojoportal</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/i7media-purchases-mojoportal</comments>
      <guid isPermaLink="true">https://i7media.com/i7media-purchases-mojoportal</guid>
      <pubDate>Mon, 06 Feb 2017 14:56:00 GMT</pubDate>
    </item>
    <item>
      <title>Long Term Support for mojoPortal</title>
      <description><![CDATA[<p class="alert alert-info"><strong>Update: </strong>i7MEDIA is now the owner of mojoPortal and is committed to its future success. <a href="https://i7media.net/i7media-purchases-mojoportal">Read more</a>…</p>

<p>As you may know, Joe Audette, founder and chief developer of mojoPortal, has announced that he will no longer be developing mojoPortal.</p>

<p>In the 7+ years I have known Joe and worked with mojoPortal, i7MEDIA has become the most trusted and experienced mojoPortal consultancy in the world. We have happy clients on every continent except Antarctica ranging in size from small start-ups to major international corporations and organizations. We've built and helped others build hundreds of mojoPortal sites. Most of our projects involving mojoPortal are still operational and we're adding more even as I'm writing this post.</p>

<p>Technology moves fast and that's a good thing, but sometimes it can move at a pace which can cause businesses to lose money if they're not careful. Whether a small company spends a few thousand dollars to build a nice website and customer portal or a large one spends several thousand dollars, scrapping what they have and building new just because there's a new technology (or even not new but more popular) doesn't make business sense.</p>

<p>We have a lot of clients who are using perfectly good and reliable WebForms systems like mojoPortal. We take a great deal of pride in the support we provide to our clients so we will be supporting and even providing enhancements to mojoPortal until we don't have any clients needing it anymore. After speaking with several of our clients over the past couple of months I can tell you, definitively, that we'll be supporting mojoPortal for quite a long while and that's fine by me and my team of mojoPortal experts.</p>

<p>So, if you're using mojoPortal already and you are looking for support, we will help you. If you're considering using mojoPortal because of its rich feature set, we will help you. <a href="https://i7media.com/hire-us">Contact us today so we can help you</a>!</p>
<br /><a href='https://i7media.com/long-term-support-for-mojoportal'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/long-term-support-for-mojoportal'>...</a>]]></description>
      <link>https://i7media.com/long-term-support-for-mojoportal</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/long-term-support-for-mojoportal</comments>
      <guid isPermaLink="true">https://i7media.com/long-term-support-for-mojoportal</guid>
      <pubDate>Fri, 20 Nov 2015 15:12:00 GMT</pubDate>
    </item>
    <item>
      <title>Ultimate mojoPortal Upgrade Guide</title>
      <description><![CDATA[<p>Due to its structure, upgrading mojoPortal is quite simple. The short story is you backup your site and database, download the new version, copy the files to your server, open the setup page and you're done. There are a few areas where one might start over thinking the process and make it harder than it really is so we decided we would write this guide to help quell the desire to make it difficult.</p>

<div class="alert alert-warning"><strong>THE GREAT BIG WARNING:</strong> If you do not backup your website and its database you are asking for trouble. While we have never had an upgrade break a site, it could happen and having a backup is the only way to insure yourself against it.</div>

<h3>The Canon</h3>

<p>The process for upgrading mojoPortal is no different if you are upgrading from a really old version or a relatively new version. mojoPortal doesn't have "minor" updates or "major" upgrades. The terms update and upgrade can be used interchangeably when referring to mojoPortal. Version numbers don't mean much, version 2.4.0.0 didn't necessarily contain any more new features or bug fixes than 2.3.7.2. The version numbers increase by 0.0.0.1 each time a database change or a set of database changes is needed. There are never "upgrade" or "update" packages released by mojoPortal. All releases packages&nbsp;contain a full installation which if&nbsp;copied to an existing site will upgrade the site.&nbsp;<strong>If you do not backup your site and database before upgrading, you are not being responsible.</strong></p>

<h3>Process Overview</h3>

<ol>
	<li>Take the Site Offline</li>
	<li>Backup the Site Files and Database</li>
	<li>Prepare the web.config File</li>
	<li>Copy New Files to the Site</li>
	<li>Bring the Site Online</li>
	<li>Run the Setup Page</li>
	<li>Make Skin Changes if Needed</li>
</ol>

<h3>Take the Site Offline</h3>

<p>You want to do this prior to backing up the site because once the site is offline, no one can make any changes to it. If you were to backup the site before taking it offline, someone could make a change which is not backed up.</p>

<p>To take the site offline, add an "App_Offline.htm" file to the root of the site. <em>The root of the site is the same location where the web.config file resides.</em> <a href="https://i7media.net/SharedFiles/Download.aspx?pageid=6&amp;mid=9&amp;fileid=402" rel="nofollow">You can download an example App_Offline.htm here</a>.</p>

<h3>Backing up</h3>

<p>There are many, many ways to backup files and databases. We will cover two methods for backing up files and two methods for backing up databases (one for MSSQL and one for MySQL).</p>

<h4>Backing up Files When You Have Access to the Server's Desktop</h4>

<p>Use this method if you have access to the servers desktop. If you don't have access to the servers desktop, use the FTP method.</p>

<p>In general, you will want to browse to the location of your site files. If you do not know what this is, you should contact your server admin or, if you are familiar with IIS, check the physical path for the site in IIS. Once you have located the site files, select all of them and create a zip file of them. We use <a href="http://7-zip.org/">7-Zip</a> but you can use whatever you like.</p>

<h4>Backing up Files with FTP</h4>

<p>Download a <strong>good</strong> FTP client which provides verbose logging and an easy way to retry operations which may have failed. We use <a href="https://filezilla-project.org/">FileZilla</a> and recommend it above any other FTP client.</p>

<p>Open your FTP client and connect to your server. Download <strong>all</strong> of the files in your site to a directory on your computer. Check the FTP Client's log for any failures and re-download any files which did not download properly.</p>

<h4>Backing up MSSQL Database in SQL Server Management Studio</h4>

<p>Use this method if you have access to the database using SQL Server Management Studio (SSMS). Some hosting providers provide this access but the more security minded hosting providers (like i7MEDIA) do not. If you cannot access the database with SSMS, use your hosting providers control panel tools to back up your database. If you are an i7MEDIA customer, follow the instructions in our "<a href="http://i7media.net/clients/knowledgebase/145/Backing-up-and-Restoring-SQL-Server-Databases.html">Backing up and Restoring SQL Server Databases</a>" knowledge base article.</p>

<h4>Create the Backup</h4>

<ol>
	<li>Open SSMS and connect to the database server hosting the database.</li>
	<li>Right-click the database in the Object Explorer of SSMS and then select Tasks &gt; Back Up. For further instructions, read the "<a href="http://technet.microsoft.com/en-us/library/ms187510.aspx#SSMSProcedure">Create a Full Database Backup</a>" article on the MSDN website.</li>
</ol>

<h4>Backing up MySQL Database using MySQL Workbench</h4>

<p>Use this method if you have access to the database using MySQL Workbench. Some hosting providers provide this access but the more security minded hosting providers (like i7MEDIA) do not. If you cannot access the database with MySQL Workbench, use your hosting providers control panel tools to back up your database. Many hosting providers do provide access to a tool called <a href="http://www.phpmyadmin.net">PHPMyAdmin</a> which you can use to back up your database as well. If you are an i7MEDIA customer, follow the instructions in our "<a href="http://i7media.net/clients/knowledgebase/172/Backing-up-and-Restoring-MySQL-Databases.html">Backing up and Restoring MySQL Server Databases</a>" knowledgebase article.</p>

<h4>Create the Backup</h4>

<ol>
	<li>Open MySQL Workbench and connect to the database server hosting the database.</li>
	<li>Select "Data Export" under "Management" in the Navigator.</li>
	<li>Select the database in the "Object Selection" panel.</li>
	<li>Select your desired options in the Options section and click the "Start&nbsp;Export" button. Note: <strong>do not </strong>select the "Skip table data" option because you will not end up with any of your site data if you do select this option.</li>
</ol>

<h3>Prepare the web.config File</h3>

<p><strong>You should use the web.config file which comes with the mojoPortal release.</strong> This cannot be stressed enough because trying to compare every line of your old web.config file and the new one will take a long time and you may miss something.&nbsp;Nearly all of the settings you might change should be done in the user.config file anyway so you shouldn't have many changes to the web.config file in the first place. A few exceptions to this rule are listed below:</p>

<dl>
	<dt><strong>machineKey</strong></dt>
	<dd>The machineKey is used for encryption and decryption of authentication cookie data and view-state data. In mojoPortal it is also used for encryption and decryption of stored passwords if the Password Storage option is set to "Encrypted." You should copy this from your previous web.config file to the new web.config file. Read our "<a href="http://i7media.net/separating-sections-from-the-mojoportal-webconfig-file">Separating Sections From the mojoPortal web.config File</a>" article if you have a lot of sites and don't want to modify the new web.config for each of them.</dd>
	<dt><strong>Keys Related to Large File Uploads</strong></dt>
	<dd>The httpRuntime and requestFiltering elements in the web.config help with the support of large file uploads. If you have made changes to these elements, you will need to copy those changes to the new web.config file. Read the <a href="https://www.mojoportal.com/supporting-large-file-uploads.aspx">Supporting Large File Uploads</a> article in the mojoPortal documentation for more information on this topic.</dd>
	<dt><strong>Keys Related to Error Pages</strong></dt>
	<dd>The configuration of custom and http error pages for a website hosted in IIS is saved in the web.config file. If you have changed these settings from the default values, you'll need to copy them over to the new web.config file. The customErrors element contains the settings for handling .net related errors and the httpErrors element contains the settings for handling http errors (e.g., 404). Tip: take a look at our article "<a href="http://i7media.net/prettifying-the-mojoportal-error-page">Pretifying the mojoPortal Error Page</a>" for information on how to modify the .net error page.</dd>
</dl>

<p>If you have several items which cannot go in the user.config file, you should keep them saved in some kind of notes file with the site. For best security, save your notes file with a .config extension to prevent it from being download via the web.</p>

<p>Note: this is an upgrade, not a new install so you <strong>should not</strong> copy create a new user.config file.</p>

<h3>Copy New Files to the Site</h3>

<p>If you have access to the servers desktop you can simply copy the files from the release (with changes made to the web.config) to the location of your site files in the order listed below. When prompted to with the option&nbsp;merge existing folders or not, select "yes." When prompted to "Copy and Replace" for existing files or "Don't copy,"&nbsp;check the "Do this for all conflicts" checkbox and then click the "Copy and Replace" option.</p>

<p>If you are accessing the site with FTP, again be sure you are using a good FTP client. Using the FTP client, upload all of the files in the order listed below. When prompted to overwrite existing files, choose whichever option overwrites the existing files.</p>

<h4>Order to Copy or Upload New Files/Folders</h4>

<ol>
	<li>Setup folder</li>
	<li>ClientScript&nbsp;folder</li>
	<li>Data folder</li>
	<li>All other files and folders</li>
</ol>

<h3>Bring the Site Online</h3>

<p>The site was taken offline by adding the App_Offline.htm file to the root of the site. To bring the site back online, all you need to do is rename or move the file. We generally customize our App_Offline.htm files with customer logos so we simply rename the file to App_Offline.config instead of moving it elsewhere.</p>

<h3>Run the Setup Page</h3>

<p>The setup page runs all of the database scripts for all of the features which have database changes. It also processes all of the feature configuration files which control what settings you see on the settings page for module instances.</p>

<p>To run the setup page, open a web browser and go to http://www.yourwebsite.url/Setup/Default.aspx. Once all of the scripts run, you will see a summary at the bottom of the page along with a link to the site.</p>

<p>If you see any errors, you will need to address them. Generally, you shouldn't see any errors but we have compiled a short list of the most common errors.</p>

<dl>
	<dt><strong>Setup is disabled. To continue, please set DisableSetup to false in Web.config.</strong></dt>
	<dd>This is showing up because the DisableSetup key in the web.config or user.config file has been set to true. If you were logged in to the site prior to upgrading, you will not see this error. To get around this, open the user.config file and change the setting to false. Next, open the web.config file and add a space to the bottom of the file. Finally, reload the setup page.</dd>
	<dt><strong>The system cannot connect to the MSSQL database. Please check your connection string.</strong></dt>
	<dd>The Connection String key in the user.config file is not correct. This error is always accompanied by more detailed information to help you troubleshoot the problem. If the database server can be accessed, it will state something to the effect of "...error occurred while establishing a connection..." If the database name, username or password is incorrect, it will state something to the effect of "the login failed."</dd>
</dl>

<h3>Make Skin Changes if Needed</h3>

<p>The skins in the mojoPortal release packages are not copied over the skins used by sites (located in \Data\Sites\[sitenum]\skins). The skins located \Data\Skins are updated or appended with the updated or new files from the release package. If you are using a skin which came with mojoPortal and have not modified it, you can copy it from \Data\Skins to \Data\Sites\[sitenum]\skins.</p>

<p>If you are using a custom skin or you have modified a packaged skin, you should check the "<a href="https://www.mojoportal.com/important-skin-changes">Important Skin Changes</a>" article in the mojoPortal Documentation for details on any changes you need to make to your skin to support the new release. You will want to check the details of every version between your old version and the new version you are installing. This is rather easy as the changes are listed in descending order in the article and there aren't very many.</p>

<h3>Summary</h3>

<p>See, it's rather simple. You don't need to worry about database scripts, different methods for minor or major versions, lots of file merging or anything like that. Really, all you need to do is create a backup and copy over the new files.</p>

<p>If you run into problems, check out the <a href="https://www.mojoportal.com/forums">mojoPortal Forums</a>. Do a search for your issue before posting because someone else may have already reported the problem and resolution has been provided by the community.</p>

<h3>Want someone else to do it?</h3>

<p>If you would rather have someone else handle upgrades for you, check out our <a href="http://i7media.net/mojoportal-upgrade-service">Upgrade Service</a>.</p>

<h3>Want to learn more about mojoPortal?</h3>

<p>If you enjoyed this guide and would like to learn more about mojoPortal, check out our <a href="http://i7media.net/mojoportal-training">Training Classes</a>.</p>
<br /><a href='https://i7media.com/ultimate-mojoportal-upgrade-guide'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/ultimate-mojoportal-upgrade-guide'>...</a>]]></description>
      <link>https://i7media.com/ultimate-mojoportal-upgrade-guide</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/ultimate-mojoportal-upgrade-guide</comments>
      <guid isPermaLink="true">https://i7media.com/ultimate-mojoportal-upgrade-guide</guid>
      <pubDate>Fri, 06 Dec 2013 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Prettifying the mojoPortal Error Page</title>
      <description><![CDATA[<p>When encountering an error on a mojoPortal site, the error.htm file is display which is a very plain page simply stating that something went wrong.</p>

<p><img alt="" class="thumbnail" src="https://i7media.com/Data/Sites/1/media/blog/error-page_old.png" /></p>

<p>Now, it gets the job done but it's kinda plain so we revamped it on our site:</p>

<p><img alt="" class="thumbnail" src="https://i7media.com/Data/Sites/1/media/blog/error-page_new.png" /></p>

<p>Is it better? Well, it's still an error message but at least it has some character. :-)</p>

<p>It's actually quite simple to accomplish as well:</p>

<ol>
	<li>Create a new file in the root of your site, we'll call it Oops.htm.</li>
	<li>Add the following to it:</li>
</ol>

<pre class="linenums language-markup" data-rel="Oops.htm">
<code>&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Error&lt;/title&gt;
		&lt;link href='https://i7media.com//fonts.googleapis.com/css?family=Architects+Daughter' rel='stylesheet' type='text/css'&gt;
		&lt;style&gt;
			html,
			body {
				width: 100%;
				height: 100%;
			}
			
			body {
				background: #f2f5f6; /* Old browsers */
				background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmMmY1ZjYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIzNyUiIHN0b3AtY29sb3I9IiNlM2VhZWQiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYzhkN2RjIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
				background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#f2f5f6), color-stop(37%,#e3eaed), color-stop(100%,#c8d7dc)); /* Chrome,Safari4+ */
				background: -webkit-radial-gradient(center, ellipse cover,  #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%); /* Chrome10+,Safari5.1+ */
				background:    -moz-radial-gradient(center, ellipse cover,  #f2f5f6 0%, #e3eaed 37%, #c8d7dc 100%); /* FF3.6+ */
				background:		-ms-radial-gradient(center, ellipse cover,  #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%); /* IE10+ */
				background:		 -o-radial-gradient(center, ellipse cover,  #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%); /* Opera 12+ */
				background: 		radial-gradient(ellipse at center,  #f2f5f6 0%,#e3eaed 37%,#c8d7dc 100%); /* W3C */
				display: table;
			}

			div.wrap {
				display: table-cell;
				vertical-align: middle;
			}
			
			div.inner {
				margin: 0 auto;
				width: 50%;
			}

			h1 {
				font-size: 40px;
				font-family: 'Architects Daughter', cursive;
				margin-top: 0;
				text-align: center;
			}

			p {
				font-size: large;
				font-family: Arial, Helvetica, sans-serif;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div class="wrap"&gt;
			&lt;div class="inner"&gt;
				&lt;h1&gt;
					Ouch! That Hurt!
				&lt;/h1&gt;
				&lt;p&gt;
					So sorry for the inconvenience but an error has occurred while trying to process your request.
				&lt;/p&gt;
				&lt;p&gt;
					The error has been logged and will be reviewed by our staff as soon as possible. It's possible the error was a momentary hiccup and you may wish to use the back button to try your request again, or you can to the &lt;a href="default.aspx"&gt;home page&lt;/a&gt;.
				&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</code>
</pre>

<ol start="3">
	<li>Open your web.config file and locate the line which looks like this:<br />
	<code class="language-markup">&lt;customErrors mode="RemoteOnly" defaultRedirect="Error.htm"&gt;</code></li>
	<li>Replace Error.htm with Oops.htm</li>
	<li>Save your web.config file.</li>
</ol>

<p>Don't forget to make this change to your web.config each time you upgrade mojoPortal.</p>

<p>Happy mojo-ing!</p>
<br /><a href='https://i7media.com/prettifying-the-mojoportal-error-page'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/prettifying-the-mojoportal-error-page'>...</a>]]></description>
      <link>https://i7media.com/prettifying-the-mojoportal-error-page</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/prettifying-the-mojoportal-error-page</comments>
      <guid isPermaLink="true">https://i7media.com/prettifying-the-mojoportal-error-page</guid>
      <pubDate>Fri, 28 Jun 2013 19:36:00 GMT</pubDate>
    </item>
    <item>
      <title>jQuery UI + mojoPortal = happiness</title>
      <description><![CDATA[<h3>What is jQuery UI?</h3>

<p><a href="http://jquery.com/">jQuery</a> is a JavaScript library, mostly used for expediting script writing. <a href="http://jqueryui.com/">jQuery UI</a> is a user interface built with jQuery. In the words of <a href="http://jqueryui.com" target="_blank">jQueryUI.com</a>:</p>

<blockquote>jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.</blockquote>

<p>Now you might think "hey, that sounds nice!", and "how do I use it on my website?". You can find instructions on how to use jQuery UI on their website, <a href="http://jqueryui.com/support" target="_blank">here</a>.</p>

<p>But, lucky for those of us using mojoPortal, jQuery is already built in — and so is jQuery UI. This post will explain how to use it with mojoPortal.</p>

<h3>Creation</h3>

<p>The first thing you need before you can integrate a new UI style into mojoPortal, is a new UI style. I highly suggest using the <a href="http://jqueryui.com/themeroller" target="_blank">jQuery UI Themeroller</a>, as it is much easier than manually changing the CSS and images for an old UI theme.</p>

<p>Before you start, you might find it helpful to click the "gallery" tab on the left and look through the native themes to see if they have something a little closer to what you want. Once you've found one that you like, click the "edit" button under it in the gallery, and you're ready to begin making changes.</p>

<p>When I do this, I usually go to my mojoPortal site design and use a color-picker to pick out the primary colors from the skin, then add them to my UI theme until it matches the skin pretty well. <em><strong>Hint</strong>: The parts of mojoPortal that use the UI tend to use it very heavily, so you'll want to go easy on the bright colors.</em></p>

<p>Once you have the theme the way you like it, click the "download theme" button. This will bring you to a page that lets you pick what UI features you need. You can disable these as you like, but if you don't care about the file size just leave it all on the defaults and scroll to the bottom of the page, where you can name your theme and then click download again.</p>

<h3>Encouragement</h3>

<p>The next part can be a little confusing the first time you do it (which is why I wrote instructions), but after you get through it once you'll realize it's actually quite easy. Working for i7MEDIA, I do it on a regular basis and now the whole process only takes me 5 minutes.</p>

<p>I've written detailed instructions below, if you follow them it shouldn't take you too long either. Have fun!</p>

<h3>Installation</h3>

<p>Once you've gotten your theme downloaded, you'll need to extract the zip file into some folder on your computer. Next, navigate within that folder to the "css" folder, and then to the folder named whatever you named the theme (default is "custom-theme"). Now just follow these instructions:</p>

<ol>
	<li>Inside of the "custom-theme" folder, there are two css files and a folder.</li>
	<li>Before putting them in your skin, you'll want to rename "jquery-ui-#.#.#.custom.css" to "style-jquery.css", and rename the "images" folder to "jquery-images".</li>
	<li>Copy the renamed images folder and css file into your skin.</li>
	<li>Open the "style.config" file within your skin and add a line that corresponds with the name of the new file.<br />
	In example: <span class="shl">&lt;file&gt;style-jquery.css&lt;/file&gt;</span> — where "style-jquery.css" is the name of the css file you copied from the folder.</li>
	<li>Now there's some slight editing you need to do within the jquery css file. Open it and do a "find-and-replace" (usually ctrl+f or ctrl+h) for the following keys:
	<ul>
		<li>Find: <span class="shl">(images/</span> — Replace with: <span class="shl">('jquery-images/</span> <a href="#exlist">[1]</a>.</li>
		<li>Find: <span class="shl">.png)</span> — Replace with: <span class="shl">.png')</span> <a href="#exlist">[2]</a>.</li>
		<li>Find: <span class="shl">(opacity</span> — Replace with: <span class="shl">('opacity</span>.</li>
	</ul>
	</li>
	<li>Now for the next one, you can't automate the find and replace because the numbers at the end of the "opacity" rule are always different. You'll need to look for any rules like this: <span class="shl">filter:Alpha('Opacity=#)</span>, and replace them with this: <span class="shl">filter:Alpha('Opacity=#')</span> — The only difference being the new apostrophe before the last parenthesis.</li>
	<li>Next, open your "layout.master" file, and search for: <span class="shl">&lt;portal:StyleSheetCombiner</span>. Once you've found it, check for the following key inside of it: <span class="shl">IncludeJQueryUI="false"</span>. If this is set for "false", you'll be okay — if it is "true", change it to "false".</li>
</ol>

<p>Hopefully, now your new UI theme works. However, if you have a really old version of mojoPortal, or are using a really old skin, you might need to read the next section, too.</p>

<h3>Changing mojoPortal's native jQuery version</h3>

<p>As of this writing, the latest version of jQuery UI is 1.9.2. The latest version of mojoPortal (2.3.9.4) ships with UI version 1.9.0 — as you can imagine, this could be a problem.</p>

<p>Usually, your particular skin will be configured to use the version of the UI that its theme was built to use when it was created. However, if you try to upload a new UI theme as per the instructions above, but find that it is not displaying properly or certain features of the UI are buggy/broken, you might need to force the mojoPortal installation you have to use a new version of the UI.</p>

<p>To do this, simply follow these instructions:</p>

<ol>
	<li>Open the layout.master file in your skin.</li>
	<li>Search for the following line: <span class="shl">&lt;portal:ScriptLoader</span>.</li>
	<li>Make sure that the ScriptLoader has the following key: <span class="shl">AssumejQueryUiIsLoaded="true"</span></li>
	<li>Once that's done, add the following line somewhere under the ScriptLoader:<br />
	<span class="shl">&lt;script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js" type="text/javascript"&gt;&lt;/script&gt;</span> - <a href="#exlist">[3]</a></li>
	<li>The numbers in that link can be changed from "1.9.2", to whatever is the latest version of jQuery UI. You can find what the latest version is and easily find the google CDN link at the bottom of <a href="http://jqueryui.com" target="_blank">this page</a>, under "quick access".</li>
</ol>

<p>You might also find this article helpful: <a href="http://www.mojoportal.com/self-hosting-jquery-jquery-ui-files" target="_blank">http://www.mojoportal.com/self-hosting-jquery-jquery-ui-files</a></p>

<h3>Help</h3>

<p>If you've read this article, followed the instructions, and ripped out your hair trying to figure out why something is still broken… Well, you might need a psychiatrist — but you can also just try asking us for help in the comments section below!</p>

<div id="exlist" style="border-bottom-color: rgb(210, 210, 210); border-bottom-width: 1px; border-bottom-style: solid;">&nbsp;</div>

<p><span class="small">[1] In this case, "jquery-images" is the name of the "images" folder that you renamed before putting it in your skin.</span><br />
<span class="small">[2] The apostrophes are necessary to stop the StyleSheetCombiner from failing to combine the CSS properly.</span><br />
<span class="small">[3] If your site has SSL, or if you just prefer not to call the script this way, you can call call it <a href="https://www.mojoportal.com/controlling-jquery-jquery-ui-versions" target="_blank">via the web.config</a>.</span></p>
<br /><a href='https://i7media.com/jquery-ui-mojoportal-happiness'>Isaac Hall</a>&nbsp;&nbsp;<a href='https://i7media.com/jquery-ui-mojoportal-happiness'>...</a>]]></description>
      <link>https://i7media.com/jquery-ui-mojoportal-happiness</link>
      <author>isaac@i7media.net (Isaac Hall)</author>
      <comments>https://i7media.com/jquery-ui-mojoportal-happiness</comments>
      <guid isPermaLink="true">https://i7media.com/jquery-ui-mojoportal-happiness</guid>
      <pubDate>Fri, 14 Dec 2012 18:46:00 GMT</pubDate>
    </item>
    <item>
      <title>Mocha Released</title>
      <description><![CDATA[<h3>Announcing the release of Mocha v1</h3>

<p>Earlier this year we released a free skin called SwiftBlue. Now we're happy to announce that we've just released another HTML5 <a href="http://www.mojoportal.com">mojoPortal</a> skin called Mocha. Mocha is SwiftBlue's Sister skin, and more are to come. It was designed as a contribution to the mojoPortal community and the <a href="http://html5mojo.codeplex.com/" target="_blank">html5mojo project</a>. Like SwiftBlue, Mocha was created with semantics-friendly HTML5 Markup.</p>

<p>Check out the <a href="http://mocha.mojoskins.com/" target="_blank" title="Visit Mocha">live demo website</a> to see what your mojoPortal website could look like today!</p>

<figure style="text-align: center; padding-top: 5px; border-top-color: rgb(211, 211, 211); border-bottom-color: rgb(211, 211, 211); border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid;"><a href="http://mocha.mojoskins.com/" target="_blank" title="Visit Mocha"><img alt="Mocha Screenshot" src="https://i7media.com/Data/Sites/1/userfiles/35/mocha-screenshot.jpg" style="width: 550px; height: 278px;" /></a>

<figcaption style="font-style: italic; margin-top: 5px; margin-bottom: 5px;"><a href="http://mocha.mojoskins.com/" target="_blank" title="Visit Mocha">Mocha</a> is an HTML5 mojoPortal skin which was designed by <a href="http://www.i7media.net" title="Visit i7MEDIA">i7MEDIA</a>.</figcaption>
</figure>

<h3>Features</h3>

<p>As with all i7MEDIA Skins, Mocha has detailed style for every feature found in mojoPortal, most notably for the Event Calendar, Event Calendar Pro, Blog, Forums, Feed manager, and jPlayer Media Players.</p>

<p>Other features include:</p>

<ul>
	<li style="margin-bottom: 5px;">Mocha includes support for a few basic content templates, including a fancy content slider. Making use of these templates will help you to create easy and professional content formats, so that you can spend less time worrying about layout and more time perfecting the content that your viewers came to see.</li>
	<li style="margin-bottom: 5px;">We've created a custom design for the dedicated Sign in and Register pages on Mocha. This way it is easier for your users to interact with the site, without having to sort through other page content.</li>
	<li>Mocha utilizes a fancy User Bar based on Twitter Bootstrap. The bar includes a lot of features, links to mojoPortal, member profiles, and the ability for administrators to toggle the settings and edit links - this way you can see your site the way your users do. But mostly it's just beautiful.</li>
	<li style="margin-bottom: 5px;">HTML5 is an important new language that is of high interest to website owners, this is because of the implications for SEO, among other things. Mocha is HTML5 Friendly. Not sure what this means? We explain more on the <a href="http://mocha.mojoskins.com/" target="_blank" title="Visit Mocha">live demo site</a>.</li>
</ul>

<h3>Support</h3>

<p>The Mocha help center is built to ensure that your time working with Mocha is successful.<br />
The skin help center covers topics like:</p>

<ul>
	<li>Installation of Mocha</li>
	<li>A basic introduction to CSS Classes and how they effect you in mojoPortal</li>
	<li>An explanation of how to use the Mocha Content Templates</li>
	<li>A FAQ to answer common questions about Mocha</li>
	<li>A form so that you can request help, and get answers to questions that weren't answered on the FAQ.</li>
	<li>Another form so that you can report any bugs you find. This is important because we'll be trying to keep the skin up to date. We feel that getting input from the users of the skin is the best way to make sure the skin is maintained well over the course of mojoPortal updates.</li>
</ul>

<p>Check out the <a href="http://mocha.mojoskins.com/skin-help.aspx" target="_blank">Mocha Skin-Help center</a> now.</p>

<p style="padding-top: 5px; border-top-color: rgb(211, 211, 211); border-top-width: 1px; border-top-style: solid;">Mocha and SwiftBlue are just another way you can make your mojoPortal site shine with a little help from i7MEDIA. Keep your eyes out, we'll be releasing more free skins soon!<br />
Interested? Check out the <a href="http://mocha.mojoskins.com/" target="_blank" title="Visit Mocha">Mocha live demo site</a></p>
<br /><a href='https://i7media.com/mocha-released'>Isaac Hall</a>&nbsp;&nbsp;<a href='https://i7media.com/mocha-released'>...</a>]]></description>
      <link>https://i7media.com/mocha-released</link>
      <author>isaac@i7media.net (Isaac Hall)</author>
      <comments>https://i7media.com/mocha-released</comments>
      <guid isPermaLink="true">https://i7media.com/mocha-released</guid>
      <pubDate>Wed, 24 Oct 2012 16:01:00 GMT</pubDate>
    </item>
    <item>
      <title>Styling the mojoPortal HTML SlideShow Pager</title>
      <description><![CDATA[<p>Back in March of 2011 we added the "Pager" option to the Slide Show feature of the mojoPortal HTML Module. Since that time, we've seen some requests for styling the pager links so here's a simple style we use on this site. It can be adapted to any design and doesn't use any images. To use this CSS, just copy it to one of your skin's .css files and then apply the "prettycyclenav" class to the "Custom CSS Class" option in the HTML module settings. If you want the slide number to be shown within the navigation, add the "withnumbers" class to the "Custom CSS Class" option.</p>

<pre class="language-css linenums" data-rel="CSS">
<code>.prettycyclenav .cyclenav {
	margin: 5px 0;
	text-align: center;
}
	
.prettycyclenav .cyclenav a {
	text-indent: -9999px;
	line-height: 40px;
	background-color: #A5A5A5;
	width: 14px;
	height: 14px;
	overflow: hidden;
	display: inline-block;
	margin: 0 5px;
	text-decoration: none;
}
	
.prettycyclenav.withnumbers .cyclenav a {
	padding: 3px;
	font: 14px/1 'Rationale', Charcoal, serif;
	text-indent: 0;
	color: #fff;
}
	
.prettycyclenav .cyclenav a:focus,
.prettycyclenav .cyclenav a.activeSlide {
	background-color: #e26917;
}	

.prettycyclenav .cyclenav a:hover {
	background: #636363;
}</code></pre>
<br /><a href='https://i7media.com/styling-the-mojoportal-html-slideshow-pager'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/styling-the-mojoportal-html-slideshow-pager'>...</a>]]></description>
      <link>https://i7media.com/styling-the-mojoportal-html-slideshow-pager</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/styling-the-mojoportal-html-slideshow-pager</comments>
      <guid isPermaLink="true">https://i7media.com/styling-the-mojoportal-html-slideshow-pager</guid>
      <pubDate>Mon, 24 Sep 2012 17:17:00 GMT</pubDate>
    </item>
    <item>
      <title>SwiftBlue v1 Released</title>
      <description><![CDATA[<p><strong>Announcing the release of SwiftBlue v1</strong></p>

<p>SwiftBlue is the first in a series of template skins developed by i7MEDIA for <a href="http://www.mojoportal.com">mojoPortal</a>. It was designed as a contribution to the mojoPortal community and the <a href="http://html5mojo.codeplex.com/" target="_blank">html5mojo project</a>. SwiftBlue has been created with semantics-friendly HTML5 Markup.</p>

<p>Check out the <a href="http://swiftblue.mojoskins.com/" target="_blank" title="Visit SwiftBlue">live demo website</a> to see what your mojoPortal website could look like today!</p>

<figure style="text-align: center; padding-top: 5px; border-top-color: rgb(211, 211, 211); border-bottom-color: rgb(211, 211, 211); border-top-width: 1px; border-bottom-width: 1px; border-top-style: solid; border-bottom-style: solid;"><a href="http://swiftblue.mojoskins.com/" target="_blank" title="Visit SwiftBlue"><img alt="" src="https://i7media.com/Data/Sites/1/userfiles/35/swiftblue-screenshot.png" style="width: 550px; height: 278px;" /></a>

<figcaption style="font-style: italic; margin-top: 5px; margin-bottom: 5px;"><a href="http://swiftblue.mojoskins.com/" target="_blank" title="Visit SwiftBlue">SwiftBlue</a> is an HTML5 mojoPortal skin which was designed by <a href="http://www.i7media.net" title="Visit i7MEDIA">i7MEDIA</a>.</figcaption>
</figure>

<p><strong>Features</strong></p>

<p>As with all i7MEDIA Skins, SwiftBlue has detailed style for every feature found in mojoPortal, most notably for the Event Calendar, Event Calendar Pro, Blog, Forums, Feed manager, and jPlayer Media Players.</p>

<p>Other features include:</p>

<ul>
	<li style="margin-bottom: 5px;">Support for a number of content templates is included in SwiftBlue. Using these templates makes it easy to make your data appear on the page in a nice professional format. It doesn't cover everything, but it will help you with the basics so you can spend more time perfecting your content and less time worrying about basic layout.</li>
	<li style="margin-bottom: 5px;">SwiftBlue is HTML5 friendly. Not sure what this means? We explain more on the <a href="http://swiftblue.mojoskins.com/" target="_blank" title="Visit SwiftBlue">live demo site</a>.</li>
	<li style="margin-bottom: 5px;">Custom styled dedicated Sign in and Register pages, this way potential users don't have to sort through the regular page content to find what they need to interact with the site.</li>
	<li>A fancy User Bar based on Twitter Bootstrap. The bar includes a lot of features, links to mojoPortal, member profiles, and the ability for administrators to toggle the settings and edit links - this way you can see your site the way your users do. But mostly it's just beautiful.</li>
</ul>

<p><strong>Support</strong></p>

<p>The SwiftBlue help center is built to ensure that your time working with SwiftBlue is successful.<br />
The skin help center covers topics like:</p>

<ul>
	<li>Installation of SwiftBlue</li>
	<li>A basic introduction to CSS Classes and how they effect you in mojoPortal</li>
	<li>An explanation of how to use the SwiftBlue Content Templates</li>
	<li>A FAQ to answer common questions about SwiftBlue</li>
</ul>

<p>And if that's not enough, we've set up an easy way for you to request help or report a bug. Check out the <a href="http://swiftblue.mojoskins.com/skin-help.aspx" target="_blank">SwiftBlue Skin-Help center</a> now.</p>

<p style="padding-top: 5px; border-top-color: rgb(211, 211, 211); border-top-width: 1px; border-top-style: solid;">SwiftBlue is just another way you can make your mojoPortal site shine with a little help from i7MEDIA.<br />
Interested? Check out the <a href="http://swiftblue.mojoskins.com/" target="_blank" title="Visit SwiftBlue">SwiftBlue live demo site</a></p>
<br /><a href='https://i7media.com/swiftblue-v1-released'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/swiftblue-v1-released'>...</a>]]></description>
      <link>https://i7media.com/swiftblue-v1-released</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/swiftblue-v1-released</comments>
      <guid isPermaLink="true">https://i7media.com/swiftblue-v1-released</guid>
      <pubDate>Wed, 15 Aug 2012 14:26:00 GMT</pubDate>
    </item>
    <item>
      <title>Hide Module Settings and Edit Links</title>
      <description><![CDATA[<p>One of the things that most of our users like the most about mojoPortal is the easy access they have to module settings and edit screens. Sometimes, people ask if they can hide these links (or icons if the skin uses those) while remaining logged into the site.</p>

<p>Well, here's an extremely easy way to hide the links without sacrificing the usability of mojoPortal. This solution is completely skin based so it doesn't require any additions to the mojoPortal core.</p>

<p>First, we add the following to our skin script (see "<a href="https://i7media.net/optimize-your-mojoportal-skin-scripts">Optimize Your mojoPortal Skin Scripts</a>" for more info):</p>

<pre class="language-javascript linenums" data-rel="scripts.js">
<code>function HideEditLinks() {
	$(".modulelinks").hide();
	$(".ModuleEditLink").hide();
}

function ShowEditLinks() {
	$(".modulelinks").show();
	$(".ModuleEditLink").show();
}

$(document).ready(function() {
	var editLinksState = Get_Cookie('editLinksState');
	if (editLinksState != null) {
		if (editLinksState == 'hidden') {
			HideEditLinks();
		}
		if (editLinksState == 'visible') {
			ShowEditLinks();
		}
	}

	$("a#togglemodulelinks").click(function() {
		editLinksState = Get_Cookie('editLinksState');
		if (editLinksState == null || editLinksState == 'visible') {
			HideEditLinks();
			Set_Cookie('editLinksState', 'hidden')
		} else if (editLinksState == 'hidden') {
			ShowEditLinks();
			Set_Cookie('editLinksState', 'visible')
		}
	});
});</code></pre>

<p>Second, we add the following inside the AutoHidePanel in the layout.master:</p>

<pre class="language-markup">
<code>&lt;a href="#" rel="nofollow" id="togglemodulelinks"&gt;Toggle Edit Links&lt;/a&gt;</code></pre>

<p>The code above simply hides the links if they're shown and displays them if they're hidden.</p>

<p>Placement of the "Toggle Edit Links" link can be done with CSS but it should definitely be inside of the <code>AutoHidePanel</code>. The <code>AutoHidePanel</code> will ensure that the link isn't shown unless one of the Admin Toolbar items is shown. You could add another <code>AutoHidePanel</code> to the layout.master but there's no point in increasing page load if you don't have to.</p>

<p>Happy mojo-ing!</p>
<br /><a href='https://i7media.com/hide-module-settings-and-edit-links'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/hide-module-settings-and-edit-links'>...</a>]]></description>
      <link>https://i7media.com/hide-module-settings-and-edit-links</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/hide-module-settings-and-edit-links</comments>
      <guid isPermaLink="true">https://i7media.com/hide-module-settings-and-edit-links</guid>
      <pubDate>Mon, 11 Jun 2012 03:03:00 GMT</pubDate>
    </item>
    <item>
      <title>Link mojoPortal Welcome Message to User's Profile</title>
      <description><![CDATA[<p>The mojoPortal Welcome Message control can be configured to link to the logged-in user's profile. This is useful if you want to have a message like "Signed In As: USER NAME" and have USER NAME link to the user's profile settings.</p>

<h4>Here's the code for it:</h4>

<pre class="language-aspnet linenums" data-rel="HTML">
<code>&lt;portal:WelcomeMessage id="WelcomeMessage" runat="server"
	CssClass="greetinglink"
	RenderAsListItem="true"
	OverrideFormat="Welcome, &lt;a id='lnkMyAccount' href='https://i7media.com/Secure/UserProfile.aspx' title='Manage your User Account'&gt;{0}&lt;/a&gt;" /&gt;</code></pre>

<p>The <code class="language-markup">{0}</code> is where the user name will be placed.</p>

<p>And that's that. Happy mojo-ing!</p>
<br /><a href='https://i7media.com/link-mojoportal-welcome-message-to-users-profile'>Joe Davis</a>&nbsp;&nbsp;<a href='https://i7media.com/link-mojoportal-welcome-message-to-users-profile'>...</a>]]></description>
      <link>https://i7media.com/link-mojoportal-welcome-message-to-users-profile</link>
      <author>joe@i7media.net (Joe Davis)</author>
      <comments>https://i7media.com/link-mojoportal-welcome-message-to-users-profile</comments>
      <guid isPermaLink="true">https://i7media.com/link-mojoportal-welcome-message-to-users-profile</guid>
      <pubDate>Tue, 05 Jun 2012 02:01:00 GMT</pubDate>
    </item>
  </channel>
</rss>