Archive for the ‘Development’ Category

Useful Regular Expressions

Wednesday, May 5th, 2010

Regular expressions are great. Anyone who delves in to scripting should pick up a little knowledge of how they work. For me – and for the development of our recent products like Unify and Just Made My Day – they have become invaluable. They work in almost any scripting language (JS, PHP, ASP, etc.) and they will save you a lot of time.

To understand their importance, think about the last time you tried to recall a TV show or song to someone but couldn’t recall the exact name. You probably said something like “It starts with a ‘P’” or maybe you hummed a few bars. And then… Eureka! They knew what you were talking about. Regular expressions are the equivalent of humming a few bars of code so that your script knows what you need.

Now, there are plenty of great resources out there that will help you get started with these crafty little expressions. I am not here to talk about them, but if you need some bearings, check out these links:

The following are the most valuable and extensible Regular Expressions that I use:

Disclaimer – These work for me in the context of code that I have written. They may not work in your code, but give them a whirl anyway. I hope they save you some time!

Tag Open w/ Specific Class

Find any HTML tag with a specific class. In this example, that class is “unicorns”. Make sure it is case insensitive for IE.

/<[^>]*class=(?:\"|\'|)[^>]*\bunicorns\b[^>]*?(?:\"|\'|)[^>]*>/i

PHP include

Find PHP includes on your pages. Returns the include path in variable 3.

/(include|include_once|require|require_once)\s*\(*(\"|\')([^\"\'<>]*)(\"|\')\)*;/

SSI – Apache

Find Apache Server-Side Includes. Returns the include path in variable 2.

/<!--#include\svirtual\=(\"|\')([^\"\'<>]*)(\"|\')\s*-->/

PHP on the page

Find any on page PHP in the midst of your HTML. Handy for removing scripts while cleaning up code.

/<\?(.|\n|\r)+?\?>/

PHP only file

Check the contents of a file to see if it only contains PHP.

/^<\?php([^?]|\?[^>])*\?>$/

Any Specific Tag + Contents

Find specific tags and return them and their contents. In this case, I have used the invalid and little known “spaghetti” tag. Again, case insensitive for IE.

/<spaghetti[^>]*>(.|\n)*?<\/\s*spaghetti>/i

Meta – Charset

Find the given charset in the page contents. Returns the charset in variable 1. Case insensitive.

/<meta[^>]*charset=\"*([^\"<]+)/i

DocType

Find the given DOCTYPE of a page contents. Case insensitive.

/<!DOCTYPE[^>]*>/i

TinyMCE Attributes

Working with TinyMCE can yield unexpected attributes. This will help you filter them out. Returns the attribute plus its value in variable 1. Case insensitive.

/<[^>]*(mce_[^=]+=(?:\"|\'|)[^\"]*(?:\"|\'|)\s*)/i

Valid File Types

A simple list of file types. Start here and eliminate/add what you want.

/\.psd|\.pdf|\.swf|\.sit|\.tar|\.tgz|\.zip|\.gzip|\.bmp|\.gif|\.jpeg|\.jpg|\.jpe|\.png|\.txt|\.doc|\.docx|\.xl|\.xls|\.flv|\.mov|\.qt|\.mpg|\.mpeg|\.mp3|\.aiff|\.aif|\.aac|\.wav|\.ppt|\.rtf|\.html|\.shtml|\.htm|\.php|\.cfm|\.phtml/

Inline Elements

A list of inline elements. A negative match would give you block elements. Case insensitive.

/\ba\b|abbr|acronym|\bb\b|basefont|bdo|big|br|cite|code|dfn|em\b|font|\bi\b|input|kbd|label|\bq\b|\bs\b|samp|select|small|span|strike|strong|sub|textarea|tt|\bu\b|var/i

Email

This is not my own. It has had a long life on the internet before now, but here it is again. Match a proper email pattern.

/^[a-zA-Z0-9,!#\$%&'\*\+\/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+\/=\?\^_`\{\|}~-]+)*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/

Multiple Emails:

I adapted this one from above. Make sure all of the emails in a list of comma separated emails are of the proper pattern.

/([a-zA-Z0-9,!#\$%&'\*\+\/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+\/=\?\^_`\{\|}~-]+)*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4},*)+$/

Strong Password

More than 5 chars, at least one uppercase and at least one numeral.

/^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w{5,}$/

Punctuation – Sentence End

Text too dull? Make every sentence an EXCLAMATION!

/(\?|\!|\.)+$/

Valid Domain

Matches a proper domain pattern.

/[^,\s]+\.{1,}[^,\s]{2,}/

Sub-Domain

Returns the sub-domain of a proper domain.

/^([^\.]+\.)/

No Special Characters

Make sure that a string is URL Friendly, and contains no special characters.

/^[a-zA-Z0-9\.\-,\s]+$/

Do you have any Regular Expressions you find useful?

Developing for Unify – pt. II

Monday, March 15th, 2010

It has been quite a while since I wrote the first part of this series, but Unify has been going through a lot of changes in the last 6 months, and I wanted to make sure to address all of the new features and improvements that have been in development.

Please Note: Every new addition to Unify is rather well debated so that we can allow the app to be as simple and easy-to-use as possible. What follows here are best practices and suggestions to help you [designers & developers] understand how Unify works so that you can create the best experience for yourself or your clients.

So, without further delay: Here is everything else you may want to know when developing a site with Unify in mind.

(The features selected in this article are based on user input, so if you want to know how Unify works with your specific configurations, please peruse the forums or contact us. Thanks!)

Aesthetics

Much of our efforts in recent months have been focused on making Unify work with—or on top of—many possible server configurations (such as IIS and Apache), browsers, and content needs (such as tables and picture galleries). As much as this adds to the power of our app, it doesn’t do much for ergonomics. So as of version 1.2.0, we greatly improved the style rendering in the editor (before & after):

Editor Styles, before and after

…and improved the HTML editor by adding a full-screen view, syntax highlighting, and allowing tabs:

HTML Editor Comparison

IMHO: these screen-shots cannot do justice to the improvements. See for yourself in our live demo.

Working Locally

Unify requires a handshake with our server in order to log in, and perform many other tasks. This means that in order to operate Unify, you need a live internet connection. This does not, however, preclude the use of a local environment to develop for Unify. Just set up your local environment, purchase a Unify license for the eventual domain that you will be using Unify on, and install the files in the proper folder. Then alias your localhost to the URL of the destination domain. Done.

Files Permissions & Auto-Update

As of version 1.2.0, Unify can accept and save your FTP Info in the dashboard. This will fix any permissions errors you may be receiving when publishing. FTP info is also required for a nice new feature of Unify: Auto-Update.

With auto-update, you and your clients don’t need to worry about working too hard keeping up with the latest Unify fixes and features. Just go to the dashboard, check to see if you are running the latest version in the update box in the top right corner, and if there is a newer version, click “Update Now!”. To run the Unify Auto-Update, you will need the PHP cURL library on your server as well.

Video & Embedded Content

As of version 1.2.4, the Unify video embed wizard only works with OBJECT and EMBED tags, but we will be adding support for HTML5 video very soon.

To make any video (or EMBED or OBJECT) editable, just add the “unify” class to it. This will allow you or your client to edit the video specs in the video embed wizard. Options include changing the size of the element, or replacing the embed code.

File Uploads & Browsing

Users can easily upload, browse, and link to images or any type of file (besides PHP, HTML, CSS, or JS). Unify will even auto-discover folders to upload to, or you can set specific folders for images and files in the Unify dashboard. Once a file is uploaded, click the search icon next to any link or image source field to browse the available files and create a link.

Working with Lightboxes & Picture Galleries

All lightbox scripts work differently, so we cannot claim support for every one that is out there, but we have taken strides to make Unify flexible enough to cover most of what you would need. Every link prompt will include a “class” and a “rel” attribute, which should give you what you need to create a link that is compatible with most lightboxes.

To adapt a common picture gallery to be editable with Unify, try the following steps when installing Unify:

  1. Add the “unifyRepeatArea” class to the gallery container.
  2. Add the “unifyRepeat” class to each image (not the link).

Now, you or your client will be able to drag a copy of any thumbnail, and then edit it. In the Unify image wizard, you can create a new lightbox image by following these steps:

  1. Through the upload interface in the top-right of the image wizard, upload the large image first by selecting the appropriate folder, and then browsing to the correct image on your hard drive.
  2. Go through the same steps to upload the thumbnail. You should now see the thumbnail image in the top-left area of the image wizard.
  3. In the fields below the thumbnail image, add the appropriate class, link and rel that your lightbox requires.
  4. Hit “done”, and if everything looks correct, hit “Publish”.

Working with Tables

As of version 1.2.3, Unify should work well with most table configurations. Here’s how:

  • If you want your table to retain a static number of entries (or rows), just add the “unify” class to the TABLE tag.
  • If you or your client will need to create new entries, you can add the “unifyRepeatArea” class to the TABLE tag, and then add the “unifyRepeat” class to your TRs  (or TDs depending on what content you want to be able to replicate… although I would recommend only repeating the TRs).
  • In both cases: To prevent any editing anomalies, please make sure to set up your table properly in your CSS. For example, a TABLE should be “display: table;”, a TBODY should be “display: table-row-group;”, a TR is “display: table-row;” and a TD should be “display: table-cell;”. Also, try adding “table-layout: fixed;” to your TABLE for more efficient rendering. IE does not recognize these, but it manages just fine on its own.

Cufon & sIFR

Unify automatically disables Cufon and sIFR in the front-end when loading a page in Unify. This means that your text will look different, but after publishing and logging out, your content will look correct on the live site. This eliminates any incompatibilities between these scripts and Unify.

Tabs & Sliding/Animating/Hidden Content

If it is on the page when the page loads, Unify can edit it. With each mouse click, Unify evaluates which editable elements are visible and hides/displays the edit icons accordingly. It will also adjust the position of the icon, but this is not fool proof.

To make sure that your icons are displayed and in the correct place in Unify after a Javascript change to the page, you only need to add one line to the end of your Javascript function:

    if (top.window.createIcons) top.window.createIcons();

This will fire the Unify “createIcons” function and move the edit icons to the right place.

Working with Dynamic Content

Unify works with what is on the page when it is loaded. If you are bringing in dynamic content, Unify will not be able to edit it properly, so make sure that any content like a twitter feed, del.icio.us feed, or anything else that is brought in through Javascript is not included in a “unify” editable area.

Moving Forward…

We have many great things planned for Unify in the near future, so keep checking in here on our blog, or follow us on twitter: http://twitter.com/unitinteractive . Also, if you have any questions or suggestions, please tell us about it here, or in our forums.

Developing For Unify – pt. I

Thursday, September 3rd, 2009

Until recently, the bulk of thought towards managing a site’s content has weighed on the side of more options and more control. With this has grown more headaches, indecipherable usability, and more opportunity for the misguided destruction of otherwise well-considered designs and/or mark-up. The guiding principle of Unify has been to put the power back in the hands of designers and developers by creating a content editing option with dead-simple, customizable implementation, limited-yet-permissive content control, and a polished, intuitive UX.

Unify is not a complicated system; in fact it is not a system at all. This two-part series will illuminate some of the unique aspects of Unify, allowing any website designer/developer the most opportunity capitalize on its potential. Unify is the closest to a plug-and-play content editor available at this time, and these tips should help make your next Unify install as quick and effortless as possible.

How Unify Works

The Unify UI is built on the jQuery library and jQuery UI. Through javascript and CSS, Unify gives a constant and accurate depiction of the changes being made to the HTML. Therefore, when manipulating items through the Unify UI, you are editing only what the browser sees. Publishing changes, on the other hand, deals with the actual HTML/PHP written in your files (more on this later). The Unify text editor is a custom build of tinyMCE, sharing all of its triumphs and tribulations. We have taken great pains in smoothing out some of tinyMCE’s eccentricities, and will continue to do so, but those with tinyMCE experience will recognize some of its hiccups.

When the changes are completed in the interface, and it comes time to publish these changes, we get to the core of what makes Unify unique. On publish, Unify will pick up the HTML/PHP page that you are publishing to (and any includes), find the elements you have edited, replace their content with the updated content, and then save those files back down on your server. This eliminates the need for a database, as your HTML/PHP files are, in a sense, storing your content. During this process, Unify also creates backups of your files, allowing for previously saved states to be “restored.”

Before all of this can take place, though, you must install Unify on the root of your website. There are some server requirements you may need to look in to at this point, but given that you have a common PHP setup, Unify should just drop on to your server and work. You should then be able to define the editable content throughout your site by adding the class of “unify” to elements. You can also use the “unifyRepeatArea” and “unifyRepeat” classes to really make your content dynamic. More on these Unify Repeatables later.

It is important to note here: Unify elements do not nest. Any “unify” or “unifyRepeat” elements within other “unify” or “unifyRepeat” elements will be ignored both by the interface and the publishing functions.

Development Environments

We have given serious consideration to how to set up development environments for Unify. In order for Unify to work, you must have purchased a license and registered your copy of Unify for a specific domain or sub-domain. Seems simple enough until you want to develop on one domain/sub-domain, and then deploy in another, right?

Unify was not designed to be a complicated solution that would require a lengthy testing period or any development area. It either works, or you will need to sort out some PHP config issues, and then it works. If you want to give it a test run, though, before deploying, we suggest one of these three options:

  • Purchase a license for a sub-domain/domain specifically for Unify installs, e.g. unify.yoursite.com. This will be a one time fee, and will allow you to use Unify in any folder in this sub-domain. You could copy fifty Unify folders in to fifty site folders for fifty clients, and they would all work in that sub-domain on one license for a one-time purchase.
  • Purchase a dev license and a live license for your client as part of your project with them, rolling this in to the cost of your project. This would allow you to develop in a sub-domain.
  • As of 07/15/10: You can now transfer any license one time. See here for more details.
  • Simply develop in a sub-folder of the domain on which you wish to use Unify.

For Unify to work, it must be installed and running on a live, licensed domain or sub-domain. This means you will need a live connection to the Internet to use Unify. It also regrettably eliminates the ability to develop in a local environment. Please see Developing for Unify pt. II for info on developing locally.

Efficiency Through Unify Repeatables & PHP Includes

Unify works with PHP includes. The UI cannot recognize if content has been brought in through a PHP include statement, but when publishing, Unify loops through all the includes called on your PHP page, and replaces the appropriate content in each. So, if you have recurring content throughout your site—e.g. in a site header—you need only make the change once and it will populate throughout the site.

Another important to note: do not put any PHP (or PHP includes) inside of a Unify element. As mentioned before, the Unify UI only knows to save what the browser sees, so this could destroy some of your server-side code when publishing. Your included Unify element must be within the include, not surrounding it.

Unify Repeatables are an all together different tool that allow you to rearrange and duplicate complex sets of elements. For example, say you have an element whose inner HTML is a little bit complicated, like so:

<div>
   <img class="fancy" src="images/fancyimg.jpg" alt="Fancy" />
   <h4>Caption Header</h4>
   <p>Some more caption content goes here</p>
</div>

If this element will need to be duplicated, you could just wrap it in a “unify” element and hope that your client is savvy enough to grab all the appropriate tags when copying. We know this is a scary thought to most developers, and this is why we created Unify Repeatables. Now you can create a “unifyRepeatArea” container, and make the original element a “unifyRepeat” element, like so:

<div class="unifyRepeatArea">
   <div class="unifyRepeat">
      <img class="fancy" src="images/fancyimg.jpg" alt="Fancy"
      »» />
      <h4>Caption Header</h4>
      <p>Some more caption content goes here</p>
   </div>
</div>

Line wraps marked “»»”. -ed.

The “unifyRepeatArea” defines a boundary. Within that boundary, “unifyRepeat” elements can be duplicated and rearranged. There can also be non-editable elements within the “unifyRepeatArea”, but these will be static, and will only be moved as nudged by other arrangeable content. “unifyRepeat” elements outside of “unifyRepeatArea” elements will be ignored by the UI and publishing functions.

By combining Unify Repeatables and PHP includes, you can create fairly dynamic and functional site modules that are easily updated through Unify.

What’s Up in Pt. II?

In part two of this series, we will look at how Unify works with dynamic content, like Twitter feeds, and how you can better implement Unify to be friendly with page behaviors such as tabs and lightboxes. Plus, we will take a look at the future of what Unify will have to offer.

Finally, That Unit PNG Fix Update You’ve Been Clamoring For…

Wednesday, July 22nd, 2009

We know you have been teetering on the edge of your collective office chairs, anticipating the next iteration of the Unit PNG Fix. Well, the wait is finally over.

Only slightly larger than its predecessor, the new Unit PNG Fix weighs in at just over 1kb and now fixes your PNGs in IE6 before the page load, eliminating any pesky flickers as the script runs. Now, your beautiful PNGs can shine as they were intended, without betraying any of their unflattering incompatibilities.

Just one more thing (black turtleneck not included): You can now opt-in to fix only the PNGs you want fixed by adding a “unitPng” class to specific elements. By default, Unit PNG Fix will fix every PNG, but this may cause layout issues, or slow your page down with PNG-Fix-Overkill. Therefore, by adding the “unitPng” class, you can target only those PNGs that are acting up.

This is likely to be the last edit to the Unit PNG Fix (barring any major scripting errors). Muerte a IE6.

Unify™ Private Beta

Tuesday, June 9th, 2009

Sign up for our private beta

Unify is out! Go here to see more about how it works, and start editing your site for just $24.49! – Nathan

For the past few months the Unit Interactive team has been working hard on a little application that is meant to solve big headaches for web designers and their clients. It’s called Unify, and it’s a website content editor that is easy to install and easy to use.

We are ready to begin private beta testing on Unify and we cordially invite you to sign up to participate.

UPDATE:
The beta testing sign-up is now closed.

What is Unify?

Unify is not a content management system. It’s is a simple content editor that anyone can use. It has a ridiculously simple implementation and requires no database integration. To use Unify, you simply go to your website, login, edit the content right on the page, and click “publish.” Done.

- no CMS
- no backend interface
- no database setup
- no proprietary syntax or tags

Just change, add, or delete content right on the page in your browser.

Setting Up Unify

For the designer/developer, implementation is a snap. Once you create an account and download Unify, just…

1.    Upload the Unify folder to the server,

Add the Unify folder to the server

2.    Add the appropriate Unify classes to the HTML elements or divs that you’d like to be able to edit, and upload the page(s) to the server.

Add the unify class to a container

…or…

Add the unify class to specific elements

3.    There is no step 3. You’re done.

Why Unify?

Not every website needs a cumbersome and complex CMS. Sometimes all someone needs is the ability to modify content; to edit contact information, to replace an image, or to change some copy. For website owners, the easiest and most intuitive way to do that would be to go to their website in a browser and edit the content right there, on the page. Unify makes this possible.

For Designers & Developers

Wouldn’t you like to have a simple content editing solution for those clients who don’t need a powerful CMS? Unify is perfect for brochure sites and other informational websites where content updates are minor and infrequent. With Unify, your clients don’t have to know HTML and they don’t need to learn to use a complex, counterintuitive backend system. Unify lets you give your clients an easy-to-use editing solution so that they can be self-sufficient …and you can determine which elements they can edit and which elements they can’t.

Unify is not a hosted solution. It lives on the website’s server. The license cost will be very low, allowing for easy inclusion in project budgeting.

Using Unify

After going to www.yourdomain.com/unify and logging in, editable areas become conspicuous on the page. Double-clicking on an editable area or clicking on the edit tab opens up an intuitive editing interface for that content element or containing div. The controls are contextual to the elements you are editing. Unify even has a robust definition list wizard; a feature lacking in other content editing apps. Unify’s intuitive image wizard allows uploading, editing, application of classes, IDs, or alternate text properties to images.

For more complex content arrays, like image+copy+stats for a typical company’s staff listing or a product listing, Unify even has a repeatable element function so that website owners can add a new staff member or product. The user can select a repeatable section, insert a duplicate, and change the relevant information or image. This function prevents your client from destroying a complex product or staff listing while editing in visual mode.

Unify works to preserve good markup. You can edit in either visual or HTML mode. The visual mode prevents users from adding presentational effects (like underlines or colors) to content, so the presentation stays within the CSS.

Sign up for the Private Beta

If you are a web designer or developer and would like to help us put Unify through its paces, please go to the Unify website and sign up to participate in our private beta.

UPDATE:
The beta testing sign-up is now closed.

Making InnerHTML and Internet Explorer Get Along

Friday, November 7th, 2008

I had been wrestling with this a couple of days ago, and thought it might be nice to share. You see, not only does Internet Explorer (all versions through 7 at least) mangle CSS, but seems to have a special interest in making Javascript applications exceedingly difficult as well. Mainly, it takes any code provided by Javascript’s innerHTML property and capitalizes all of the tags before spitting it back out in the desired element. This sounds harmless enough, but by my standards, IE should have no business rewriting my code. Therefore, I devised this little script, using a bit of Regular Expression goodness (» represents line breaks):

newElement.innerHTML = element.innerHTML.replace(/<.([A-Za-z]*[A-Za-z0-9]w*)?(?=.*>)/gi, » function(w) {return w.toLowerCase();});

Now that I had that solved, I had a new problem: IE runs a rather vague error when trying to place HTML in to <p> tags. Specifically it is an “Unknown Runtime Error”… specifically. Now, I know that innerHTML is not specified by W3C, and IE is probably just doing what it thinks is best, not allowing HTML in to a non-block level element, but what about an anchor tag, or a <strong> tag? Well, with a little help from the DOM, I came up with this:

// oldElement being the element you want to place HTML in to...
var replacement = new Element(oldElement.tagName);

// now, copy all of the attributes of newElement to replacement...
for(i=0; i<$oldElement.attributes.length; i++) {
   replacement.setAttribute(oldElement.attributes[i].nodeName,» oldElement.attributes[i].nodeValue);
}

// put some code in to replacement...
replacement.innerHTML = "<a href='#'>Place some <strong>code here</strong>.</a>";

// and then pull the old switch-a-roo!
oldElement.parentNode.replaceChild(replacement, oldElement);

Well, you would think that would be enough to tame ol’ IE, but no: the folks at Microsoft have cooked up one more obstacle. All versions of IE that I have encountered will rewrite all relative urls to absolute urls on page load. I have yet to find an answer as to why, or how to stop it. This, again, crosses my ideal that the browser has no business rewriting my code, and makes for the handling of certain tasks very difficult. At this point, I throw myself on the mercy of our readers… any ideas?

Verification for Ampersands in URLs: The Movie.

Thursday, September 11th, 2008

Scene 1:
The road is abandoned except for one bold soul careening through the twists and curves of asphalt, his engine crying in mutiny against the silence of the hazy morning. In the man’s rear view mirror, lights flare up out of nowhere in a lively sequence of blue and red that might seem almost festive if they weren’t attached to the roof of a state cruiser. They pull over to the side of the road. Each footstep sounds more contemptuous than the last as the trooper approaches the side of the vehicle.

“Sir, are you aware that you just blew right through 92 validation errors back there?” The trooper says, grimacing as he adjusts his weighty belt.

“What? I mean no… no I wasn’t aware. S-sir.” The man wonders why his reflection looks so scared in the trooper’s sunglasses.

“Seems as though you have a bunch of ampersands that need to be converted to their correct HTML entity ‘&amp;’.” The trooper’s teeth are gritting.

“No… No sir, I wrote everyone out by hand! I promise!”

“Bet you didn’t think to check your href’s… how about on that link you generated off of Google translate? Or on that link from your website host? Leaving the ‘&’ unconverted could cause the link to be broken when the query happens to be an HTML entity as well, like ‘&sect;’, and such. You see, the browser translates ‘&amp;’ to ‘&’ so the server will only see ‘&’ and not ‘&amp;’ in the query string.”

“Shoot, officer, I didn’t know you’re supposed to convert those too.”

“Only every time you use ’em,” scolds the trooper, sounding fatherly. The man feels sorry for whoever might be his kid. “I’m gonna let you off with a warning this time. But don’t let me catch you making the same mistake.”

“No, no, of course not,” the man says, searching for his license and registration. “Never again. I will always be sure to convert any ‘&’ to ‘&amp;’ in the future. Especially in my URLs.”

The man turns back to the window to hand the trooper his information, but the trooper, and his almost festive lights are gone.

Unit PNG Fix Fix

Tuesday, September 2nd, 2008

The Unit PNG Fix has gotten pretty popular, with close to 15,000 downloads and 1,500 saves on del.icio.us, so we thought we should probably make sure it works as best as it can. Labs has been recently updated with a new version of the fix (the latest is from 08/31) that should solve most of the problems that have been reported. Most notably, the absolute position bug should be fixed.

We want to give a big thank you from Unit Interactive to everyone who wrote in about bugs, concerns, suggestions and adulations. Please, keep them coming. We are always looking to improve our scripts and will continue sharing them.

Recommended
Most Popular
Underappreciated