Opportune Solutions is dedicated to providing consulting, support services and products so its clients can focus on growing their business. Your success is our goal. When you succeed, we succeed.

Recent Posts

A Lesson Quickly Learned Via Technology

This morning my son, Jack, asked me if he could see the Panama Canal on a map. Should I get out the atlas and show him? Maybe Wikipedia? There were lots of things we could have done, but I opted to pull out my smart phone. My phone is a Droid with Google’s android OS, but other smart phones or my wife’s touch would have worked as well. A computer could do the trick as well, but that is so last year. Here is what I did:

    1. I turned it on and pressed the maps app.
    2. Pressed the search button
    3. Pressed the voice search button
    4. Spoke the words “Panama Canal”

3 presses on the screen, 2 words and a total of 15 seconds later I had a map showing the Panama Canal. I first zoomed out and showed him exactly where it was in relation to North and South America. Then I zoomed in and followed the canal to the Atlantic side locks. I was able to zoom in to show just a single lock and the satellite image even had a ship in one of the locks.

I explained how the water in the locks is controlled by gravity and replenished by lot of rain fall throughout the year. He loved hearing about how the trains pull the large ships through the canal and especially how small a pirate ship would have been if it went through the canal.

All-in-all, a very informative 5 minutes. Perhaps sometime when Jack is not getting ready for school, we can spend some more time reading about the Panama Canal on Wikipedia.

Better Business Bureau Accreditation

Opportune Solutions has received accreditation from the Better Business Bureau (BBB) and now proudly displays the BBBOnline Trustmark in the lower right hand corner of the website. Clicking on the trustmark will show the approval on the BBB website.

BBB accreditation promotes trust and confidence on the Internet. Only businesses that adhere to the BBB Code of Business Practices, including its online standards are allowed to display the BBB Accredited Business seal.

Opportune Solutions wants to provide its clients with every assurance that they are working with an honest company that will provide a valuable service. BBB accreditation is one of many assurances that we meet this goal.

A Barage of System Problems

The latter half of last week and now early this week, I have just been hit with a lot of system problems and a lot of down time. To sum this up, my Adobe Creative Suite then my Microsoft Office suites stopped working. Both indicated licensing and user access permissions were no longer valid. In fact, my licensing was fine, it just stopped working properly on my system.

I use 3 licensed applications extensively and two of them failed in the same day. Fortunately, all the open source applications I use don’t and probably will never have a similar problem. Just to be fair, I think the Office problem started because of the fixes necessary to get the creative suite working.

So you might say, just reinstall or repair the applications and your back to work. Not the case. I could not repair them, reinstall them and in the case of Adobe, I couldn’t even delete it.

At Adobe’s request, I used the following 2 programs to resolve the problem.
1. MSICUU2.exe – This is a program from microsoft which allows you to remove programs that the standard microsoft installer will not uninstall. AKA Windows Installer Cleanup Utility (http://support.microsoft.com/kb/290301)

2. Wincs3clean.exe – An adobe program that cleans up the registry. I think this cause my office problem.

I reinstalled Adobe, Adobe worked and Office did not. I could install and uninstall Office, but the current user could not run any applications. After some searching on the Internet, I found that you could run the applications as administrator.

There is a program called SetACL.exe that allowed me to fix the problem. This modified some permission in the registry that I would rather not have changed, but after 24 hours of unproductivity, I was getting desparate. Anyway, this did the trick.
setacl -ot reg -on “HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components” -actn setprot -op “dacl:np;sacl:nc” -rec yes

Since then, I have had a couple Blue Screen of Death (BSOD) crashes due to my video card and running multiple monitors. I have updated the display driver but still got a BSOD. After more searching, the problem is being seen on both WinXP and Vista, both 32 and 64-bit systems with both ATI and nVidia video cards. One person said installing a second video card and running one monitor off each video card works rather than plugging 2 monitors into the same video card fixed their problem.

That doesn’t seem like a good solution to me, besides I don’t have a second PCI express 16x slot for a second video card. Some people reported multiple crashes per day. I am doing much better than that.

I guess I am just lucky that way!

Helpful Hints for Form Input

When you have limited space on your home page or any other page for that matter, it is nice to provide a little more helpful information for the use where form space is limited. Now, by just adding a single attribute to your input text, your will get the gray help text in your input box.

<input class="standout" type="text" />hintvalue="Search ..." class="smallbox" name="s" type="text" autocomplete="off" />

Just add the javascript from this article and any styles that you want and you are done. Here is a working example. Click in the boxes and watch it work.

How it works

The guts of the work is done in javascript in two objects. The first is a simple object called ClassName that will add or remove a class name from any object like the input tag. You could just set the className of the object and then delete it when done, but the ClassName object allows for multiple classes to be set on the input tag.

ClassName = {
    add: function (obj, clsName) {
        if(!ClassName.exists(obj,clsName)) obj.className+=obj.className?' '+clsName:clsName;
    remove: function (obj, clsName) {
        obj.className=obj.className.replace(obj.className.match(' '+clsName)?' '+clsName:clsName,");
    exists: function (obj, clsName) {
        return new RegExp('\\b'+clsName+'\\b').test(obj.className);

The Hint object is the main object that makes everything work. It performs 5 primary functions. It initializes all input tags that have the hintvalue attribute set with an onFocus and onBlur event to show or hide the hint. When the form is submitted, any hints will be removed so the server gets the intended value. There is also a function to dynamically attach an event to any html/dom object.

Hint = {
    cls_name: "hint_display",
    attr_name: "hintvalue",
    show: function (inputObj) {
        if (inputObj.target) inputObj = inputObj.target;
        else if (inputObj.srcElement) inputObj = inputObj.srcElement;
        if (inputObj.value.length == 0) {
            ClassName.add(inputObj, Hint.cls_name);
            inputObj.value = inputObj.getAttribute(Hint.attr_name);
    hide: function (inputObj) {
        if (inputObj.target) inputObj = inputObj.target;
        else if (inputObj.srcElement) inputObj = inputObj.srcElement;
        if (ClassName.exists(inputObj, Hint.cls_name)) {
            if (inputObj.getAttribute(Hint.attr_name) == null) {
                inputObj.setAttribute(Hint.attr_name, inputObj.value);
            inputObj.value = "";
        ClassName.remove(inputObj, Hint.cls_name);
    submit: function () {
        tags = document.getElementsByTagName("INPUT");
        //submit: function (formObj) {
        //tags = formObj.getElementsByTagName("INPUT");
        for (var i = 0; i < tags.length; i++) {
            if (ClassName.exists(tags[i], Hint.cls_name)) tags[i].value = "";
    listen: function(element, evtName, funcPtr) {
        if (typeof element == 'string')
            element = document.getElementById(element);
        if (element.addEventListener) {
            element.addEventListener(evtName, funcPtr, false);
        } else if (element.attachEvent) {
            element.attachEvent('on'+evtName, funcPtr);
        } else return false;
        return true;
    init: function(parentObj) {
        //if (parentObj == null) parentObj = document;
        parentObj = document;
        var tags = parentObj.getElementsByTagName("INPUT");
        for (var i = 0; i < tags.length; i++) {
            if (tags[i].getAttribute(Hint.attr_name) != null) {
                hintval = tags[i].getAttribute(Hint.attr_name);
                if (tags[i].value == hintval || tags[i].value == "") {
                   tags[i].value=hintval;ClassName.add(tags[i], Hint.cls_name);
                } else 
                   ClassName.remove(tags[i], this.cls_name);
                // Now add the events
                if (!Hint.listen(tags[i], 'blur', Hint.show) ||
                    !Hint.listen(tags[i], 'focus', Hint.hide)) {
                    // if we can't add the events, no hints.
                    ClassName.remove(tags[i], Hint.cls_name);
        for(j=0; j<document.forms.length; j++) {
            Hint.listen(document.forms[j], 'submit', Hint.submit);

Finally, call the hint initialization when the page is fully loaded and add any styles to make the boxes and text display like you want them to.

Hint.listen(window, 'load', Hint.init);
/* css styles */
/* What will the hint text look like?  This will make it gray */
.hint_display {color:#666666}
/* Now, make the the search box have small text and a blue border */
.smallbox {font-size:70%;border-color:blue;}

A Little Explanation

After more than a year of absolutely positioning divs to put the hint text above a text box and dealing with all the cross browser issues that came with that, not to mention more markup and quite a bit of time, I finally resorted to changing the value of the text box to show the hint and just add a class to allow it to look like a hint.

This has solved all positioning problems associated with the divs approach. The only problems now are that you cannot use an image as the hint like this website and the hint must be hidden when the form is submitted. Not much can be done about the images and that is not a big problem for me. As for the submitting issue, I have added an event to each form to remove the hint text when the form is submitted. So, why is that a problem? Some forms are submitted through a custom function and sometimes ajax is used to validate form fields on the fly. These will still work, but care must be taken to capture the value correctly. I.e. If ajax also validates a field on the onBlur event, that listener must be registered before the hints onBlur event.

Put it all together

Include the following javascript file in your web page and add the hintvalue attribute to your input tag and you are ready to go.

See the full example here: HTML Example


This is a very simple and easy to use set of functions to provide a fully functional hint and any input field. Give it a try.

Challenge to anyone who wants to try: Because of the events added to form fields and the form itself, an excellent extension to this would be to add a validate attribute to the field that would act as a regular expression to check in the onBlur.

Any takers?

New Website Released

Opportune Solutions has released this all-new website. Those of you who visited the old site will notice that the logo has changed. Officially, the Opportune Solutions logo is still the old version which is only 3 colors and 2D. The new logo, although now only based two colors is actually made up of many colors to properly highlight, shade and create the reflection.



Old Logo with 3 colors


New 3-D Logo with many colors



I have always read and assumed that a logo should only be 2 or three colors, but I don’t think that is the case with today’s media. There are certainly some things where only 2 colors are important, like an embroidered company logo on a sweat shirt. There aren’t many though and having a logo that is more appealing and eye catching probably outweighs any benefits of having fewer colors.

In the not too distant future, Opportune Solutions may officially switch to the new one. I may make a two color version for when it is needed, but I bet it will just gather dust if that is possible in the digital age.

St. Mark's Cheyenne
St. Mark's Cheyenne

Visit Website
Larger Image

Chris' professionalism and attention to detail is his strength; he is both creative and prompt, and continuously focuses on our institution's needs. We attribute our online success to Opportune Solutions.

Tracy Wilson
Marketing Manager
WyHy Federal Credit Union