/*the following corrects a conflict between .net ajax client libraries and mootools. */
Array.extend({	
    forEachMT: function(fn, bind){
		for (var i = 0, j = this.length; i < j; i++) fn.call(bind, this[i], i, this);
    }
});

Array.prototype.each = Array.prototype.forEachMT;

function $each(iterable, fn, bind){
	if (iterable && typeof iterable.length == 'number' && $type(iterable) != 'object') Array.forEachMT(iterable, fn, bind);
	
	else for (var name in iterable) fn.call(bind || iterable, iterable[name], name);
};

var QueryString = new Class({
    initialize: function(url){
        if(url == null) { 
            url = location.search; 
        }

        $A(url.replace('?','').split('&')).each(function(s){
            this[s.split('=')[0]] = unescape(s.split('=')[1]);
        }.bind(this));
    }
});

window.getClientHeight = function() { 
    var innerHeight = window.innerHeight ? window.innerHeight : 0;
    var elemClientHeight = document.documentElement ? document.documentElement.clientHeight : 0;
    var bodyClientHeight = document.body ? document.body.clientHeight : 0;
	
    var result = innerHeight ? innerHeight : 0;
 
    if ( elemClientHeight && (!result || (result > elemClientHeight))) result = elemClientHeight;
        
    var actualHeight =  bodyClientHeight && (!result || (result > bodyClientHeight)) ? bodyClientHeight : result;
    return actualHeight;
}
        
window.getClientWidth = function() {
    var innerWidth = window.innerWidth ? window.innerWidth : 0;
    var elemClientWidth = document.documentWidth ? document.documentElement.clientWidth : 0;
    var bodyClientWidth = document.body ? document.body.clientWidth : 0;
	
    var result = innerWidth ? innerWidth : 0;
 
    if ( elemClientWidth && (!result || (result > elemClientWidth))) result = elemClientWidth;
        
    var actualWidth =  bodyClientWidth && (!result || (result > bodyClientWidth)) ? bodyClientWidth : result;
    return actualWidth;
}

//The following code Extends the Microsoft.Web.Extensions to correctly identify new version of Safari
Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit
if( navigator.userAgent.indexOf( 'WebKit/' ) > -1 )
{
  Sys.Browser.agent = Sys.Browser.WebKit;
  Sys.Browser.version = parseFloat( navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
  Sys.Browser.name = 'WebKit';
}

//Regular Expression Enum

var RegularExpressions = {
    NotBlank : "[a-z|A-Z|0-9]+",   

    ValidEmail : "^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$",
    ValidPassword : "^.{6,15}$",
    NoSpecialChar : "^[^()<>@,;:&\"[\\]\\\\]+$",
    
    ValidZip : "^[0-9]{5}$",
    ValidZipCanada : "^\\w{3}\\s\\w{3}$",
    ValidPhone : "^[0-9-]{8,15}$",
  
    ValidCommunityScreenName : "^[a-zA-Z0-9_-]{3,20}$",
    ValidMIN: "^\\d{3}[-]{0,1}\\d{3}[-]{0,1}\\d{4}$",
    ValidUSMIN: "^[2-9]\\d{2}[-]{0,1}\\d{3}[-]{0,1}\\d{4}$",
    InValidSecurityAnswer: "[&<>]"
};

var JsExceptionHandler = {
    HandleException : function(ex) {
        alert(ex);
    }
};

var JS = {}; 
JS.Ford = {}; 
JS.Ford.Sync = {}; 
JS.Ford.Sync.Common = {}; 

JS.Ford.Sync.Common.Validator = new Class(
{
    _objToValidate : {},
    _failedValidationMethod : {},
    _validationMethod : {},
    
    initialize : function(objToValidate,validationMethod,failedValidationMethod) {
        this._objToValidate = objToValidate;
        this._failedValidationMethod = failedValidationMethod;
        this._validationMethod = validationMethod;
        
    },
    
    getValue : function() {
        return this._objToValidate.value;
    },
    getFailedValidationMethod : function() {
        if (this._failedValidationMethod != null)
            return this._failedValidationMethod();
        else
            return null;
    },
    getValidationMethod : function(arg) {
        try {
            return this._validationMethod(arg);
        }
        catch(ex) {
            JsExceptionHandler.HandleException(ex);
        }
    }
});

JS.Ford.Sync.Common.TextBoxValidator = JS.Ford.Sync.Common.Validator.extend(
{
     _regEx : "",
       
     initialize : function(objToValidate,regEx,validationMethod,failedValidationMethod) {
        this._regEx = regEx;
        this._objToValidate = objToValidate;
        this._validationMethod = validationMethod;
        this._failedValidationMethod = failedValidationMethod;
    },
    //gets value of TextBox
    getValue : function() {
        return this._objToValidate.value;
    },
    
    validate : function() {
        if (this._regEx != null) {            
            var regex = new RegExp(this._regEx);
            try {
                if (regex.exec(this.getValue()) == null)
                    return false;
         
                else 
                    return true; 
            }
            catch(ex)
            {
                JsExceptionHandler.HandleException(ex);
            }
        }
        else  { // use validation method
            return this.getValidationMethod(this.getValue());
        }
    }
});

JS.Ford.Sync.Common.DropDownListValidator = JS.Ford.Sync.Common.Validator.extend(
{
    initialize : function(objToValidate,validationMethod,failedValidationMethod) {
        this._objToValidate = objToValidate;
        this._validationMethod = validationMethod;
        this._failedValidationMethod = failedValidationMethod;
        

    },
    
    getValue : function() {
        
        var val = null;
        
        //bug fix - item may be removed from the DOM and replaced in which case we need to reselect it with $
        var obj = $(this._objToValidate.id); 
        
        if (obj.length > 0)
            val = obj[obj.selectedIndex].value;
        else
            val = "";

        return val; 
    },
    
    validate : function() {    
        return this.getValidationMethod(this.getValue());
    }

});

JS.Ford.Sync.Common.PasswordValidator = JS.Ford.Sync.Common.Validator.extend(
{
    _pwdObjArray : [],
    
    initialize : function(passwordObjArray,failedValidationMethod) {
        this._pwdObjArray = passwordObjArray;
        this._failedValidationMethod = failedValidationMethod;
    },
    
    getValue : function(index) {
        if(index < 2) {
            return this._pwdObjArray[index].value;
        }
    },
    
    validate : function() {
        if (this.getValue(0) == this.getValue(1)) {
            return true; 
        }
        else  {
            return false; 
        }
    }

});

JS.Ford.Sync.Common.RadioButtonValidator = JS.Ford.Sync.Common.Validator.extend(
{
    _selector : null,
    
    initialize : function(elementSelector, failedValidationMethod) {
        this._selector = elementSelector;
        this._failedValidationMethod = failedValidationMethod;
    },
    
    getElement : function() {
        return $ES("input[type='radio']", this._selector);
    },
    
    getValue : function() {
        var el = this.getElement();
        
        if ($chk(el)) {
            for (i=0; i<el.length; i++) {
                if (el[i].checked) return el.value;
            }
        }
        
        return null;
    },
    
    getIndex : function() {
        var el = this.getElement();
        
        if ($chk(el)) {
            for (i=0; i<el.length; i++) {
                if (el[i].checked) return i;
            }
        }
        
        return -1;
    },    
    
    validate : function() {
        if (!$chk($(this._selector))) return true; // element not in DOM
    
        if (this.getIndex() > -1) {
            return true; 
        }
        else  {
            return false; 
        }
    }

});

JS.Ford.Sync.Common.CheckBoxValidator = JS.Ford.Sync.Common.Validator.extend(
{
    _regEx: "",

    initialize: function(objToValidate, regEx, validationMethod, failedValidationMethod) {
        this._regEx = regEx;
        this._objToValidate = objToValidate;
        this._validationMethod = validationMethod;
        this._failedValidationMethod = failedValidationMethod;
    },
    //gets value of TextBox
    getValue: function() {
        return this._objToValidate.checked;
    },

    validate: function() {
        
        if (this.getValue() == true)
            return true;
        else
            return false;
            
    }
});

JS.Ford.Sync.Common.ValidatorChain = new Class(
{
    _objChain : [],
    _mainValidationFailedMethod : {},
    _mainValidationPassedMethod : {},
    
    initialize : function(mainValidationFailedMethod,mainValidationPassedMethod) {    
        //reset this instance of the object chain so that the prototype value doesnt retain the information. 
        this._objChain = [];
        this._mainValidationFailedMethod = mainValidationFailedMethod;
        this._mainValidationPassedMethod = mainValidationPassedMethod; 
    },
    
    add : function(validatorObj) {
        this._objChain[this._objChain.length] = validatorObj;
    },
    
    remove : function(validatorObj) {
        this._objChain.remove(validatorObj);
    },
    
    replace : function(objToRemove,objToReplace) { 
        if(this._objChain[this._objChain.indexOf(objToRemove)] != null) { 
            this._objChain[this._objChain.indexOf(objToRemove)] = objToReplace; 
            return true; 
        }
        else { 
            return false; 
        }
    },
    
    validate : function() { 
        var isValid = true;
        var validateFailedMethodCalled = (this._mainValidationFailedMethod) ? false : true;
        for(var i=0; i < this._objChain.length; i++) {
            if (!this._objChain[i].validate()) {
                if (!validateFailedMethodCalled) {
                    this._mainValidationFailedMethod(); 
                    validateFailedMethodCalled = true; 
                }
                try {
                    if (this._objChain[i].getFailedValidationMethod() != null) {
                        this._objChain[i].getFailedValidationMethod();
                    }
                }
                catch(ex) {
                    JsExceptionHandler.HandleException(ex);
                }
                isValid = false;
            }
        }
        
        if((isValid) && (this._mainValidationPassedMethod != null)) { 
            this._mainValidationPassedMethod(); 
        }
        

        return isValid;
        
    }
});

JS.Ford.Sync.Own = {}; 
JS.Ford.Sync.Own.Common = {}; 
JS.Ford.Sync.Own.Common.Constants = {
    "UploadDownloadURL" : "/Own/Modules/UploadDownload/UploadDownload.aspx"
}

JS.Ford.Sync.Own.Common.Redirect = {
    toUploadProcess : function() { 
        var redirect = JS.Ford.Sync.Own.Common.Constants.UploadDownloadURL;
         
        if(Sys.Browser.agent == Sys.Browser.InternetExplorer) { 
            document.location.href = redirect + '?method=activex&uploadfiles=true&external=true';  
        } 
        else  { 
            document.location.href = redirect + '?method=applet&uploadfiles=true&external=true'; 
        }  
    }
}

function redirectToUpload() { 
    JS.Ford.Sync.Own.Common.Redirect.toUploadProcess(); 
}

JS.Ford.Sync.Repeater = new Class({
    '_dataSource' : [],
    '_itemTemplate' : {}, 
    '_output' : '',
    '_container' : {},
    
    initialize : function(container) { 
        this._container = container; 
    },
    
    databind : function() {
        for(var i=0; i < this._dataSource.length; i++) { 
            //get a match of all possible tags.  
            var result = this._itemTemplate.match(/\{moo\:([a-zA-Z\d_]+)\}/g); 
            //put the current instance of itemtemplate into another reference to avoid buggy behavior. 
            var templateCopy = this._itemTemplate; 
            var properties = []; 
            //iterate the matched tags
            for(var j=0; j < result.length; j++) {
                var property = result[j].substring(result[j].indexOf('moo:')+4,result[j].length-1); 
                templateCopy = templateCopy.replace(result[j],this._dataSource[i][property]); 
            }
            
            this._output += templateCopy;
        }
        
        this._container.setHTML(this._output); 
        this._output = '';  
    },
    
    clear : function() { 
        this._container.empty(); 
    },
    
    get_Container : function() { 
        return this._container; 
    },
    
    set_ItemTemplate : function(template) { 
        this._itemTemplate = template; 
    },
    
    set_DataSource : function(collection) { 
        this._dataSource = collection; 
    }
 }); 
 

var SysUtils = {
    closeFlashPlayer : function() {
        document.location.href = document.location.href; 
    }
};

SysUtils.Resx = {
    'Message_Loading': gLoadingMsg,
    'Button_Close' : 'asdf',
    'set_Resx' : function() {
        if (arguments.length > 1 && $type(arguments[0])=='string' && $type(arguments[1])=='string') {
            this[arguments[0]] = arguments[1];
        }
        else if ($type(arguments[0])=='object') {
            for (var key in arguments[0]) this[key] = arguments[0][key];
        }
    }
};

SysUtils.SearchBroker = {
    '_currentPage' : null,
    '_searchMethod' : {},
    
    initialize : function(method) { 
        this._searchMethod = method; 
    },
    
    begin : function(args,context) { 
        context.clear();
        
        var progressLoader = new Element('img', { 'src' : '/Own/img/Global/processing.gif' } ).setStyles({'margin-top':10,'margin-bottom':10}); 
        progressLoader.injectInside(context.get_Container());        
        
        this._searchMethod.pass(args)(); 
    }, 
    
    complete : function(result,context) {
        context.clear(); 
        context.set_DataSource(result); 
        context.databind(); 
    },
    
    getPagination : function(resPerPage,currentChunk,totalChunks,totalResultLength) { 
        var pagination = {}; 
        
        pagination.from = (resPerPage*currentChunk)-resPerPage; 
        pagination.to = (currentChunk==totalChunks) ? totalResultLength-1 : ((resPerPage*currentChunk)-resPerPage)+(resPerPage-1);

        return pagination; 
    },
    
    setInitialPage : function(elArray,pageObj,iterator) { 
        var idArray = []; 
        
        for(var i=0; i< pageObj.resultsPerPage; i++) {
            idArray[i] = pageObj.results[i]; 
        }
        
        this._currentPage = elArray; 

        elArray.each(function(el) { 
            el.addClass('currentPage');
            el.removeEvents('click');
        }); 
        
        this.begin([idArray,pageObj.searchQuery,this.complete,null,iterator],iterator); 
    },
    
    changePage : function(elArray,pageObj,iterator) { 
        if(this._currentPage != null) { 
            this._currentPage.each(function(el) { 
                el.removeClass('currentPage');
                el.addEvent('click',function(e) { 
                    new Event(e).stop(); 
                    var pageLinks = []; 
                    var searchToken = this.innerHTML; 
                    $$('a.pagination').each(function(el) { 
                        if(el.innerHTML == searchToken) { 
                            pageLinks[pageLinks.length] = el; 
                        }
                    });
                    SysUtils.SearchBroker.changePage(pageLinks, pageObj,iterator);
               });  
            }); 
        }
        
        //disable the clicked page link. 
        this._currentPage = elArray; 
        elArray.each(function(el) { 
            el.addClass('currentPage'); 
            el.removeEvents('click');   
        });   
              
        var pagination = this.getPagination(pageObj.resultsPerPage,elArray[0].innerHTML.toInt(),
                                                pageObj.totalPages,pageObj.results.length); 
        
        var idArray = []; 
        var j = 0; 

        for(var i=pagination.from; i<=pagination.to; i++) { 
            idArray[j] = pageObj.results[i]; 
            j++; 
        }
        this.begin([idArray,pageObj.searchQuery,this.complete,null,iterator],iterator);                 
    }
}



SysUtils.OverlayManager = {

    _timer: null,

    _init: false,

    current: null,

    cssSelector: "overlay",

    cssContentFrameSelector: "overlayContentFrame",

    cssContentSelector: "overlayContent",

    orientator: ".footerCont",

    overlayImageOffset: 4,

    init: function() {
        if (!SysUtils.OverlayManager._init) {
            window.addEvent('click', function() { if (SysUtils.OverlayManager._timer != null) SysUtils.OverlayManager.reset(); });
            SysUtils.OverlayManager._init = true;
        }
    },

    get: function() {
        var el = $(SysUtils.OverlayManager.current);

        if (!$chk(el)) {
            SysUtils.OverlayManager.init();

            el = new Element("div", { "id": SysUtils.OverlayManager.current, "class": SysUtils.OverlayManager.cssSelector });
            el.setStyles({ "visibility": "hidden" });
            el.inject(document.body);

            var buttons = new Element("div", { "class": "buttons" });
            buttons.injectInside(el);

            var button = new Element("a", { "class": "overlayButton", "href": "#" });
            button.setHTML(String.format("<strong>{0}</strong>", SysUtils.Resx.Button_Close));
            button.injectInside(buttons);
            button.addEvent("click", function(event) { event = new Event(event); event.stop(); SysUtils.OverlayManager.reset(); });

            el.addEvent("mouseenter", function() { SysUtils.OverlayManager.clearTimer(); });
        }

        return el;
    },

    orient: function(el, coords) {
        var bounds = {
            "winX": window.getWidth(),
            "scrollX": window.getScrollLeft()
        };

        bounds.maxX = bounds.winX;

        var orientator = $E(SysUtils.OverlayManager.orientator);

        if (orientator) {
            bounds.maxX = Math.min(bounds.maxX, orientator.getCoordinates().right);
        }

        if (coords.left + el.getCoordinates().width - bounds.scrollX > bounds.maxX) {
            el.setStyle("right", bounds.winX - Math.min(coords.right, bounds.maxX) - SysUtils.OverlayManager.overlayImageOffset);
            el.setStyle("left", "auto");
        }
        else {
            el.setStyle("left", coords.left - SysUtils.OverlayManager.overlayImageOffset);
            el.setStyle("right", "auto");
        }

        el.setStyle("top", coords.bottom - SysUtils.OverlayManager.overlayImageOffset);
        el.setStyle("bottom", "auto");
    },

    provide: function(id, cssDecorator, coords) {
        if (SysUtils.OverlayManager.current != id) {
            SysUtils.OverlayManager.reset();

            SysUtils.OverlayManager.current = id;
        }

        var el = SysUtils.OverlayManager.get();

        el.className = SysUtils.OverlayManager.cssSelector; // in case it's been decorated previously

        if (cssDecorator) {
            el.addClass(cssDecorator);
        }

        var contentFrame = $E(String.format(".{0}", SysUtils.OverlayManager.cssContentFrameSelector), el);

        if (!$chk(contentFrame)) {
            contentFrame = new Element("div", { "class": SysUtils.OverlayManager.cssContentFrameSelector });
            contentFrame.injectInside(el);
        }

        var content = $E(String.format(".{0}", SysUtils.OverlayManager.cssContentSelector), contentFrame);

        if (!$chk(content)) {
            content = new Element("div", { "class": SysUtils.OverlayManager.cssContentSelector });
            content.injectInside(contentFrame);
        }
        else {
            if (content.hasClass("autoHeight")) {
                content.removeClass("autoHeight");
            }

            content.empty();
        }

        if (coords) {
            SysUtils.OverlayManager.orient(el, coords);
        }

        el.setOpacity(0);
        el.setStyles({ "visibility": "visible" });

        var _fade = new Fx.Style(el, "opacity", { 'duration': 1000 });
        _fade.addEvent("onComplete", function() { SysUtils.OverlayManager.showShim(el); });
        _fade.start(0, 1);

        return content;
    },

    provideImage: function(id, cssDecorator, coords, markup) {
        if (SysUtils.OverlayManager.current != id) {
            SysUtils.OverlayManager.reset();

            SysUtils.OverlayManager.current = id;
        }

        var el = SysUtils.OverlayManager.get();

        el.className = SysUtils.OverlayManager.cssSelector; // in case it's been decorated previously

        if (cssDecorator) {
            el.addClass(cssDecorator);
        }

        var contentFrame = $E(String.format(".{0}", SysUtils.OverlayManager.cssContentFrameSelector), el);

        if (!$chk(contentFrame)) {
            contentFrame = new Element("div", { "class": SysUtils.OverlayManager.cssContentFrameSelector });
            contentFrame.injectInside(el);
        }

        var content = $E(String.format(".{0}", SysUtils.OverlayManager.cssContentSelector), contentFrame);

        if (!$chk(content)) {
            wrapper = new Element("div", { "class": SysUtils.OverlayManager.cssContentSelector });
            markupcode = $E('#' + markup);
            wrapper.innerHTML = markupcode.innerHTML;
            wrapper.injectInside(contentFrame);
        }

        if (coords) {
            SysUtils.OverlayManager.orient(el, coords);
        }

        el.setOpacity(0);
        el.setStyles({ "visibility": "visible" });

        var _fade = new Fx.Style(el, "opacity", { 'duration': 1000 });
        _fade.addEvent("onComplete", function() { SysUtils.OverlayManager.showShim(el); });
        _fade.start(0, 1);

        el.addClass('autoHeight');
    },

    fixHeight: function(cont) {
        if (SysUtils.OverlayManager.needsHeightFix()) {
            var _size = cont.getSize();

            if (_size.scrollSize.y < _size.size.y) {
                cont.addClass("autoHeight");

                if (SysUtils.OverlayManager.needsShim()) SysUtils.OverlayManager.getShim().setStyles({ "height": _size.scrollSize.y + 50 });
            }
        }

    },

    needsHeightFix: function() {
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
            return true;
        }

        return false;
    },

    reset: function() {
        SysUtils.OverlayManager.clearTimer();

        if (SysUtils.OverlayManager.current) {
            var el = $(SysUtils.OverlayManager.current);

            if (el) {
                el.setStyles({ "visibility": "hidden" });
                el.addClass("displayNone");
            }

            SysUtils.OverlayManager.current = null;
        }

        SysUtils.OverlayManager.hideShim();
    },

    setExitTimer: function() {
        SysUtils.OverlayManager._timer = SysUtils.OverlayManager.reset.delay(3000);
    },

    clearTimer: function() {
        if (SysUtils.OverlayManager._timer != null) {
            $clear(SysUtils.OverlayManager._timer);
            SysUtils.OverlayManager._timer = null;
        }
    },

    getShim: function() {
        var el = $('overlayShim');

        if (!$chk(el)) {
            el = new Element("iframe", { "id": "overlayShim", "frameborder": "0", "src": (window.location.protocol == 'https:' ? "://0" : "javascript:''") });
            el.setStyles({ "display": "block", "position": "absolute", "visibility": "hidden", "top": "0", "left": "0", "width": 0, "height": 0, "background": "transparent", "color": "#FFFFFF" });
        }

        return el;
    },

    showShim: function(obj) {
        var coords = obj.getCoordinates();

        if (SysUtils.OverlayManager.needsShim()) {
            var el = SysUtils.OverlayManager.getShim();
            el.setStyles({ "top": coords.top + 5, "left": coords.left + 5, "width": coords.width - 10, "height": coords.height - 10, "visibility": "visible" });
            el.injectBefore(obj);
            return el;
        }
    },

    hideShim: function() {
        if (SysUtils.OverlayManager.needsShim()) {
            var el = SysUtils.OverlayManager.getShim();
            el.setStyles({ "display": "block", "position": "absolute", "visibility": "hidden", "top": "0", "left": "0", "width": 0, "height": 0, "background": "transparent" });
            return el;
        }
    },

    needsShim: function() {
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
            return true;
        }

        return false;
    }
}

SysUtils.NoteBuilder = {
    insert : function(id, cssClass, anchor, content) {
        var el = SysUtils.OverlayManager.provide(id, cssClass, $(anchor).getCoordinates());
        
        el.setHTML(content);
        SysUtils.OverlayManager.fixHeight(el);
    }
}

/* abstract class in terms that it cannot be instantated but when inhereted from these methods become a part of the new class */
JS.Ford.Sync.Common.DiscoveryService = new Class({
    'invoke' : function() { 
        $$(this._properties.selector).each(function(el) {
            el.addEvent('click',function(e) { 
                new Event(e).stop(); 
                this[1].clickDelegate(this[0]); 
            }.bind([el,this])); 
        }.bind(this)); 
     },
    
    'buildOverlay' : function(el,serviceArgs) { 
        SysUtils.OverlayBuilder.insert(this._properties.serviceMethod,serviceArgs,this._properties.overlayId,this._properties.cssClass,el,this._properties.yOffset); 
    }
});

JS.Ford.Sync.Common.FeatureNotesDiscoveryService = JS.Ford.Sync.Common.DiscoveryService.extend({
    '_properties' : {},
    
    'initialize' : function(options) { 
        this._properties.serviceMethod = options.serviceMethod; 
        this._properties = $extend(this._properties,(options || {})); 
    },
    
    'clickDelegate' : function(el) { 
        parser = new QueryString(el.href.substring(el.href.indexOf("?"),el.href.length)); 
        var params = parser["deviceinfo"].split("#$#");
                
        for(var i=0; i < params.length; i++) { 
            params[i] = params[i].replace(/\+/g," "); 
        } 
                
        var iopId = params[0]; 
        var deviceId = params[1]; 
        var firmware = params[2]; 
        var featureNoteId = parser["featureid"]; 
                
        var serviceArgs = [ 
            iopId,
            deviceId,
            firmware,
            featureNoteId,
            this.asyncCallback
        ];
        
        this.buildOverlay(el,serviceArgs); 
    },
    
    'asyncCallback' : function(result) { 
        if (!$chk(result)) return;
        
        this.overlay.empty(); 
        this.overlay.setHTML(result); 
        SysUtils.OverlayManager.fixHeight(this.overlay);
    }
}); 

JS.Ford.Sync.Common.FAQDiscoveryService = JS.Ford.Sync.Common.DiscoveryService.extend({
    '_properties' : {},
    
    'initialize' : function(options) { 
        this._properties.serviceMethod = options.serviceMethod; 
        this._properties = $extend(this._properties,(options || {})); 
    },
    
    'clickDelegate' : function(el) { 
                
        var _faqId = el.href.replace(/^([^?]*\?faqId=)/i, '');
                
        var serviceArgs = [
            _faqId,
            this._properties.languageId,
            this.asyncCallback
        ]; 
        
        this.buildOverlay(el,serviceArgs); 
    },
    
    'asyncCallback' : function(result) {  
        this.overlay.empty();

        if (!$chk(result)) return;

        if ($chk(result.Question)) {
            var question = new Element("div", { "class" : "question" }).setHTML(result.Question); 
            question.injectInside(this.overlay); 
        }

        if ($chk(result.Answer)) {
            var answer = new Element("div", { "class" : "answer" }).setHTML(result.Answer); 
            answer.injectInside(this.overlay);
        }
        
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
            $ES('img.fixPNG', this.overlay).each(function(el) { fixPNG(el); });
        }
        
        SysUtils.OverlayManager.fixHeight(this.overlay);
    }
});

JS.Ford.Sync.Common.MultiFAQDiscoveryService = JS.Ford.Sync.Common.DiscoveryService.extend({
    '_properties': {},

    'initialize': function(options) {
        this._properties.serviceMethod = options.serviceMethod;
        this._properties = $extend(this._properties, (options || {}));
    },

    'clickDelegate': function(el) {

        var _faqIds = el.href.replace(/^([^?]*\?faqIds=)/i, '').split(',');

        var serviceArgs = [
            _faqIds,
            this._properties.languageId,
            this.asyncCallback
        ];

        this.buildOverlay(el, serviceArgs);
    },

    'asyncCallback': function(result) {
        this.overlay.empty();

        if (!$chk(result)) return;

        var faqContainer = new Element("div", {});
        faqContainer.injectInside(this.overlay);

        var i;
        for (i = 0; i < result.length; i++) {

            var faqSubContainer = new Element("div", {});

            if ($chk(result[i].Question)) {
                var question = new Element("div", { "class": "question" }).setHTML(result[i].Question);
                question.injectInside(faqSubContainer);
            }

            if ($chk(result[i].Answer)) {
                var answer = new Element("div", { "class": "answer" }).setHTML(result[i].Answer);
                answer.injectInside(faqSubContainer);
            }

            var faqBreak = new Element("br", {}).injectInside(faqSubContainer);

            faqSubContainer.injectInside(faqContainer);
        }

        if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
            $ES('img.fixPNG', this.overlay).each(function(el) { fixPNG(el); });
        }

        SysUtils.OverlayManager.fixHeight(this.overlay);
    }
}); 

// The discovery service factory shields any using code from the complexity and default values required
// to setup one of the service discovery methods. 
SysUtils.DiscoveryServiceFactory = {
    
    'getFeatureNotesService' : function(options) { 
        var defaultOptions = {
            'serviceMethod' : Ford.Sync.Own.UI.WebServices.CompatibilityService.GetFeatureNotes,
            'selector'  : 'a.featureNotes',
            'overlayId' : 'noteOverlay',
            'cssClass'  : 'featureNoteOverlay'
        }
          
        defaultOptions = $extend(defaultOptions,(options || {})); 
       
        //setup default values for the feature notes discovery service.  
        return new JS.Ford.Sync.Common.FeatureNotesDiscoveryService(defaultOptions); 
    },
    
    'getFAQService' : function(options) { 
        var defaultOptions = {
            'serviceMethod' : ($chk(Ford.Sync.Own.UI.WebServices.FaqService)) ? Ford.Sync.Own.UI.WebServices.FaqService.GetFAQ : Ford.Sync.Own.UI.WebServices.FaqServiceSSL.GetFAQ,
            'selector' : 'a.faqLink',
            'languageId' : null,
            'overlayId' : 'faque',
            'cssClass' : 'faqOverlay',
            'yOffset' : 0
        }
       
        defaultOptions = $extend(defaultOptions,(options || {})); 
        
        return new JS.Ford.Sync.Common.FAQDiscoveryService(defaultOptions);      
    },
    
    'getMultiFAQService' : function(options) { 
        var defaultOptions = {
            'serviceMethod': ($chk(Ford.Sync.Own.UI.WebServices.FaqService)) ? Ford.Sync.Own.UI.WebServices.FaqService.GetMultiFAQ : Ford.Sync.Own.UI.WebServices.FaqServiceSSL.GetMultiFAQ,
            'selector' : 'a.multiFaqLink',
            'languageId' : null,
            'overlayId' : 'faque',
            'cssClass' : 'faqOverlay',
            'yOffset' : 0
        }
       
        defaultOptions = $extend(defaultOptions,(options || {}));

        return new JS.Ford.Sync.Common.MultiFAQDiscoveryService(defaultOptions);      
    }
}

SysUtils.OverlayBuilder = {
    '_properties' : { 
        'overlay' : {},
        'progressLoader' : '/Own/img/Global/processing.gif'
    },
    
   'insert' : function(serviceMethod,serviceArgs, id, cssClass, link, yOffset) { 

        var coords = $(link).getCoordinates(); 
        
        if (yOffset) {
            coords.height += yOffset;
            coords.bottom += yOffset;
        }

        var el = SysUtils.OverlayManager.provide(id, cssClass, coords);

        this._properties.overlay = el; 

        //bind properties object to callback      
        if(typeof(serviceArgs[serviceArgs.length-1] == 'function')) { 
            var boundFunction = serviceArgs[serviceArgs.length-1].bind(this._properties); 
            serviceArgs[serviceArgs.length-1] = boundFunction; 
            serviceMethod.pass(serviceArgs)(); 
        }
    }
}

SysUtils.TextBoxUtils = { 

    clearTextBox : function(obj) { 
    
        try { 
            obj.value = ""; 
        }
        catch(err) { 
        
        }
    }
}


SysUtils.VINValidator = { 
    
    isEmpty : function(str){		// check if string is empty
	    if (str.length == 0) return true;
	    else return false;
    },

    isNotAlphaNumeric : function(str){
       var charpos = str.search("[^a-hA-Hj-nJ-NpPr-zR-Z0-9]"); 
      
       if(str.length > 0 &&  charpos >= 0)
       {
        return false; 
       }
       else
       {
        return true;
       }

    },

    //Returns true if string is a valid VIN number.
    isVIN : function(str) {
	    var a_vin = new Array(17);
	    var i_checksum = 0, i_pos = 0;
	    var a_alphavalue = new Array(1,2,3,4,5,6,7,8,-1,1,2,3,4,5,-1,7,-1,9,2,3,4,5,6,7,8,9);
	    var a_positionvalue = new Array(8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2);
	    var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

	    var x;
	    i_checksum = 0;

	    for (x = 0; x < 17; x++)	{
	       a_vin[x] = str.substring(x,x+1);
		    a_vin[x] = a_vin[x].toUpperCase();

		    i_pos = uppercaseLetters.indexOf(a_vin[x],0);
		    if (i_pos == -1)		{
		       i_checksum += parseInt(a_vin[x]) * a_positionvalue[x];
		    }
		    else			{
			    i_checksum += a_alphavalue[i_pos] * a_positionvalue[x];
	       }
	    }
	    i_checksum %= 11;

	    if (((i_checksum >= 0 || i_checksum <= 9) && (parseInt(a_vin[8]) == i_checksum)) || ((i_checksum == 10) && (a_vin[8] == "x"))){
	       return true;
	    }
	    return false;
    },

    validate : function(str)   {
	    if (SysUtils.VINValidator.isEmpty(str)) return false;
	    if (str.length != 17) return false;
	    if (SysUtils.VINValidator.isNotAlphaNumeric(str)) {
	        return true;
	    }
	    else {
	        return false;
	    }
    }
}

SysUtils.BrowserValidation = { 
    _msg : "For the best experience, we recommend using a supported browser.",
    
    set_msg : function(msg) {
        SysUtils.BrowserValidation._msg = msg;
    },

    validate : function() {
        if (!SysUtils.BrowserValidation.browserIsSupported()) {
            SysUtils.BrowserValidation.warn();
        }
    },
    
    warn : function() {
        SysUtils.GlobalAdvisory.warn(SysUtils.BrowserValidation._msg);
    },

    browserIsSupported : function() { 
        if((Sys.Browser.agent == Sys.Browser.InternetExplorer) && (Sys.Browser.version >= 6) && (Sys.Browser.version < 9)) { 
            return true; 
        }
        else if((Sys.Browser.agent == Sys.Browser.Firefox) && (Sys.Browser.version >= 2) && (Sys.Browser.version < 4)) { 
            return true; 
        }
        else if((Sys.Browser.agent == Sys.Browser.Safari) && (Sys.Browser.version >= 2) && (Sys.Browser.version < 5))  { 
            return true;
        }
        else if((Sys.Browser.agent == Sys.Browser.WebKit) && (Sys.Browser.version >= 412)) {
            return true;
        }
        
        return false; 
    }

}

SysUtils.AJAXOverlayBuilder = { 
    "_isInit" : false,
    "_backgroundID" : "_overlayBackground",
    "_progressID" : "_overlayProgress",
    "_progressMsg" : SysUtils.Resx.Message_Loading,
    "_shimID" : "_overlayShim",    
    "_pageManagerInstance" : {},
    "_overlayOpen" : false,
    "_overlays" : [],
    "_currentOverlay" : null,
    "_currentOverlayParent" : null,
    "_opacityFixClass" : "widgetOverlayScrimOpacityFix",    
    
    init : function(beginRequestHandler,pageLoadedHandler) {
        if (!SysUtils.AJAXOverlayBuilder._isInit) {
            //get the .net ajax page request manager instance
            SysUtils.AJAXOverlayBuilder._pageManagerInstance = Sys.WebForms.PageRequestManager.getInstance(); 
            
            if (beginRequestHandler == null) { 
                //add default request method. 
                SysUtils.AJAXOverlayBuilder._pageManagerInstance.add_beginRequest(SysUtils.AJAXOverlayBuilder.progressLoaderInit); 
            }
            else { SysUtils.AJAXOverlayBuilder._pageManagerInstance.add_beginRequest(beginRequestHandler); }
            
            if (pageLoadedHandler == null) { 
                //add default page loaded handler
                SysUtils.AJAXOverlayBuilder._pageManagerInstance.add_pageLoaded(SysUtils.AJAXOverlayBuilder.pageLoaded); 
            }
            else { SysUtils.AJAXOverlayBuilder._pageManagerInstance.add_pageLoaded(pageLoadedHandler); } 
        
            SysUtils.AJAXOverlayBuilder._isInit = true;
        }
    },
    
    registerOverlay : function(ol) {
        SysUtils.AJAXOverlayBuilder._overlays[SysUtils.AJAXOverlayBuilder._overlays.length] = ol;
    },
    
    needsShim : function() {
        /**/
        //RM TESTING
        return false;
        //*/
            
        if (SysUtils.AJAXOverlayBuilder.opacityFixRequired() && Sys.Browser.agent == Sys.Browser.Firefox) {
            return true;
        }
        
        return false;
    },
    
    getShim : function(id) {
        id = id || SysUtils.AJAXOverlayBuilder._shimID;
        var el = $(id);

        if (!$chk(el)) {
            el = new Element("iframe", {"id":id, "frameborder":"0", "src":"javascript:''"});
            el.setStyles({"display":"block", "position":"absolute", "top":"0", "left":"0", "width":0, "height":0, "visibility":"hidden", "z-index":"10", "background":"#FFFFFF"});
            el.injectInside(document.body);
        }

        return el;
    },
    
    showShim : function(coords) {
        if (SysUtils.AJAXOverlayBuilder.needsShim()) {
            var _shim = SysUtils.AJAXOverlayBuilder.getShim();
            _shim.setStyles({"top":coords.top+2, "left":coords.left+2, "width":coords.width-4, "height":coords.height-4, "visibility":"visible"});
        }
    },

    hideShim : function() {
        if (SysUtils.AJAXOverlayBuilder.needsShim()) {
            var _shim = SysUtils.AJAXOverlayBuilder.getShim();
            _shim.setStyles({"top":"0", "left":"0", "width":0, "height":0, "visibility":"hidden"});
        }
    },
    
    getBackground : function(id) {
        id = id || SysUtils.AJAXOverlayBuilder._backgroundID;
        var el = $(id);
        
        if (!$chk(el)) {
            el = new Element("div", { "id" : id, "class" : "widgetOverlayScrim" } );
            
            if (SysUtils.AJAXOverlayBuilder.opacityFixRequired()) {
			    el.addClass(SysUtils.AJAXOverlayBuilder._opacityFixClass);
		    }

            el.setHTML(" ");            
            el.injectInside(document.body);
        }
        
        return el;
    },
    
    showBackground : function() {
        var _background = SysUtils.AJAXOverlayBuilder.getBackground();
        _background.setStyles({"width":window.getScrollWidth(), "height":window.getScrollHeight()});
        
        if (SysUtils.AJAXOverlayBuilder.opacityFixRequired()) {
            _background.setStyles({"visibility":"visible"});
        }
        else {
            _background.setOpacity(0);
            _background.setStyles({"visibility":"visible"});
            var _fadeIn = new Fx.Style(_background, "opacity").start(0,.5);
        }
    },
    
    hideBackground : function() {
        var _background = SysUtils.AJAXOverlayBuilder.getBackground();
        
        if (!SysUtils.AJAXOverlayBuilder.opacityFixRequired()) {
            _background.setOpacity(0);
        }
        
        _background.setStyles({"width":1, "height":1, "visibility":"hidden"});
    },
    
    getProgressLoader : function(id) {
        id = id || SysUtils.AJAXOverlayBuilder._progressID;
        var el = $(id);
        
        if (!$chk(el)) {
            el = new Element("div", {"id":id, "class":"widgetOverlayProgress"});
            el.setStyles({"position":"absolute", "visibility":"hidden", "height":"96px", "width":"335px", "background":"url(/Own/img/Global/overlay/faq_corners.png) no-repeat", "padding":"10px 20px"});
            el.setHTML(String.format('<p style="color:#000; padding: 0 0 14px 4px;font-size:22px;">{0}</p><img alt="" src="/Own/img/Global/processing.gif" style="margin: 0"/>', SysUtils.AJAXOverlayBuilder._progressMsg));
            el.injectInside(document.body);
        }
        
        return el;
    },
    
    showProgressLoader : function() {
        var _progress = SysUtils.AJAXOverlayBuilder.getProgressLoader();
        
        if (_progress.style.visibility == "hidden") {
            _progress.setStyles(SysUtils.AJAXOverlayBuilder.getCentering(_progress.getSize())).setStyles({"visibility":"visible"});
        }
    },
    
    hideProgressLoader : function() {
        var _progress = SysUtils.AJAXOverlayBuilder.getProgressLoader();
        _progress.setStyles({"visibility":"hidden", "top":1, "left":1});
    },
    
    progressLoaderInit : function() {
        if(!($(SysUtils.AJAXOverlayBuilder._currentOverlay))) {
            for (var i=0; i < SysUtils.AJAXOverlayBuilder._overlays.length; i++) { 
                if($(SysUtils.AJAXOverlayBuilder._overlays[i])) {
                    SysUtils.AJAXOverlayBuilder._overlayOpen = true;
                    SysUtils.AJAXOverlayBuilder._currentOverlay = SysUtils.AJAXOverlayBuilder._overlays[i];
                    break;
                }
            }
        }
                
        if(!($(SysUtils.AJAXOverlayBuilder._currentOverlay))) {
            var _trigger = $(arguments[1].get_postBackElement());
            
            if (_trigger.hasClass('widgetTrigger')) {
                SysUtils.AJAXOverlayBuilder.showProgressLoader();
                SysUtils.AJAXOverlayBuilder.showBackground();
            }
        }
        else {
            SysUtils.AJAXOverlayBuilder.showProgressLoader();
        }
    },
    
    pageLoaded : function() {
        if(!($(SysUtils.AJAXOverlayBuilder._currentOverlay))) {
            for (var i =0; i<SysUtils.AJAXOverlayBuilder._overlays.length; i++) {
                if ($(SysUtils.AJAXOverlayBuilder._overlays[i])) {
                    SysUtils.AJAXOverlayBuilder._overlayOpen = true;
                    SysUtils.AJAXOverlayBuilder._currentOverlay = SysUtils.AJAXOverlayBuilder._overlays[i];
                    break;
                }
            }
        }

        SysUtils.AJAXOverlayBuilder.hideProgressLoader(); 
        
        if(!($(SysUtils.AJAXOverlayBuilder._currentOverlay))) {
            SysUtils.AJAXOverlayBuilder.hideBackground();
            SysUtils.AJAXOverlayBuilder.hideShim();
            
            SysUtils.AJAXOverlayBuilder._currentOverlay = null;
            SysUtils.AJAXOverlayBuilder._overlayOpen = false; 
        }
        else {
            var el = $(SysUtils.AJAXOverlayBuilder._currentOverlay);
            
            SysUtils.AJAXOverlayBuilder._currentOverlayParent = el.parentNode;

            SysUtils.AJAXOverlayBuilder.fixScrollbars(el, false);
            el.injectInside(document.forms[0]);

            $ES('.widgetTrigger', el).each(
                function(item) {
                    if (item.tagName == 'A') {
                        item.addEvent('click', function() { SysUtils.AJAXOverlayBuilder.prepareSubmit(); });
                    } else if (item.tagName == 'SELECT') {
                        item.addEvent('change', function() { SysUtils.AJAXOverlayBuilder.prepareSubmit(); });
                    } else if (item.tagName == 'INPUT') {
                        if (item.hasClass('textEditorWidgetTextBox')) {
                            item.addEvent('keypress', function(event) { event = new Event(event); if (event.key == 'enter') { event.stop(); var btn=$E('.textEditorWidgetButton', SysUtils.AJAXOverlayBuilder._currentOverlay); if (btn) { SysUtils.AJAXOverlayBuilder.prepareSubmit(); btn.click(); } } });                           
                        }
                    }
                }
            );
 
            SysUtils.AJAXOverlayBuilder.showElement(el);
            $ES('INPUT',el).each(function(el2) { el2.focus(); });
        }
    },

    loadEmbeddedOverlay : function(o) {
        SysUtils.AJAXOverlayBuilder._currentOverlay = o.id;
        
        SysUtils.AJAXOverlayBuilder.showProgressLoader();
        SysUtils.AJAXOverlayBuilder.showBackground();
                
        SysUtils.AJAXOverlayBuilder._currentOverlayParent = o.parentNode;
        
        SysUtils.AJAXOverlayBuilder.fixScrollbars(o, false);
        o.injectInside(document.forms[0]);
        
        $ES('.widgetTrigger', o).each(
            function(item) {
                if (item.tagName == 'A') {
                    item.addEvent('click', function() { SysUtils.AJAXOverlayBuilder.prepareSubmit(); });
                } else if (item.tagName == 'SELECT') {
                    item.addEvent('change', function() { SysUtils.AJAXOverlayBuilder.prepareSubmit(); });
                }
            }
        );
        
        SysUtils.AJAXOverlayBuilder.hideProgressLoader();
        SysUtils.AJAXOverlayBuilder.showElement(o);
    },
    
    closeEmbeddedOverlay : function() {
        var el = $(SysUtils.AJAXOverlayBuilder._currentOverlay);
        
        if (el) {
            el.setStyles({"visibility":"hidden", "top":"0", "left":"0"});
            el.injectInside(SysUtils.AJAXOverlayBuilder._currentOverlayParent);
        }
        
        SysUtils.AJAXOverlayBuilder._currentOverlay = null;
        SysUtils.AJAXOverlayBuilder._currentOverlayParent = null;
        
        SysUtils.AJAXOverlayBuilder.hideProgressLoader();
        SysUtils.AJAXOverlayBuilder.hideBackground();
    },
    
    prepareSubmit : function() {
        SysUtils.AJAXOverlayBuilder.hideShim();

        var el = $(SysUtils.AJAXOverlayBuilder._currentOverlay);
        
        if (el) {
            SysUtils.AJAXOverlayBuilder.hideElement(el);
            SysUtils.AJAXOverlayBuilder.returnElement(el);
        }
    },
    
    returnElement : function(el) {
        el.injectInside(SysUtils.AJAXOverlayBuilder._currentOverlayParent);
        SysUtils.AJAXOverlayBuilder._currentOverlayParent = null;
    },
    
    centerElement : function(el) {
        el.setStyles(SysUtils.AJAXOverlayBuilder.getCentering(el.getSize()));
        return el;
    },
    
    getCentering : function(objSize) {
        var _win = window.getSize();
        return {"top":(_win.scroll.y.toInt()+(_win.size.y.toInt()/2)-(objSize.size.y.toInt()/2)), "left":(_win.scroll.x.toInt()+(_win.size.x.toInt()/2)-(objSize.size.x.toInt()/2))};
    },
    
    showElement : function(el) {
        SysUtils.AJAXOverlayBuilder.fixFlash(false);
        
        //if(Sys.Browser.agent == Sys.Browser.InternetExplorer) {$ES('img.fixPNG', el).each(function(img){fixPNG(img);});}
        
        SysUtils.AJAXOverlayBuilder.centerElement(el).setOpacity(0).setStyles({"visibility":"visible"});
        
        var _fade = new Fx.Style(el, "opacity", {'duration':1000});
        _fade.addEvent("onComplete", function() { SysUtils.AJAXOverlayBuilder.showShim(); SysUtils.AJAXOverlayBuilder.fixScrollbars(el, true); });
        _fade.start(0,1);
        
        return el;
    },
    
    hideElement : function(el) {
        SysUtils.AJAXOverlayBuilder.fixFlash(true);
        SysUtils.AJAXOverlayBuilder.hideShim();
        SysUtils.AJAXOverlayBuilder.fixScrollbars(el, false);
        
        var _fade = new Fx.Style(el, "opacity", {'duration':500});
        _fade.addEvent("onComplete", function() { el.setStyles({"visibility":"hidden"}); });
        _fade.start(1,0);

        return el;
    },
    
    opacityFixRequired : function() {
        if (navigator.userAgent.toLowerCase().indexOf("mac") > -1) {
            return true;
        }
        
        return false;
    },
    
    fixFlash : function(showFlash) {
        if (SysUtils.AJAXOverlayBuilder.flashFixRequired()) {
            showFlash = showFlash === false ? false : true;

            if ($('flashcontent')) $('flashcontent').style.visibility = (showFlash?'visible':'hidden');
        }
    },
    
    flashFixRequired : function() {
        if (navigator.userAgent.toLowerCase().indexOf("mac") > -1 && Sys.Browser.agent == Sys.Browser.Firefox) {
            return true;
        }
        
        return false;
    },

    fixScrollbars : function(el, showScrollbars) {
        if (SysUtils.AJAXOverlayBuilder.scrollbarFixRequired()) {
            scrollbarStyle = showScrollbars === false ? '-moz-scrollbars-none' : '-moz-scrollbars-vertical';
            
            if (el.hasClass("vehicleSelectorWidgetScroller") || el.hasClass("radioHeadSteeringWheelWidgetScroller")) {
                $ES('.widgetContent', el).each(function(item) { item.setStyles({"overflow":scrollbarStyle}); });
            }
        }
    },
    
    scrollbarFixRequired : function() {
        if (navigator.userAgent.toLowerCase().indexOf("mac") > -1 && Sys.Browser.agent == Sys.Browser.Firefox) {
            return true;
        }
        
        return false;
    }
}

SysUtils.FlashFailover = {
    "_css" : "globalFlashError",
    "_msg" : "This site is best viewed with the Flash plugin.",

    "validate" : function() {
        if (typeof deconcept!="undefined") {
            if (!(deconcept.SWFObjectUtil.getPlayerVersion().versionIsValid(new deconcept.PlayerVersion([6,0,0])))) {
                SysUtils.FlashFailover.warn();
            }
        }
    },
    
    "warn" : function() {
        SysUtils.GlobalAdvisory.warn(SysUtils.FlashFailover._msg, SysUtils.FlashFailover._css);
    },
    
    "set_msg" : function(msg) {
        SysUtils.FlashFailover._msg = msg;
    }
}

SysUtils.GlobalAdvisory = {
    "_id" : "globalErrorAdvisory",
    "_css" : "globalGenericError",
    "_anchor" : ".outerBuffer",
 
     "warn" : function(msg, css, id, anchor) {
        id = id || SysUtils.GlobalAdvisory._id;

        if (!$(id)) {
            anchor = anchor || SysUtils.GlobalAdvisory._anchor;
            css = css || SysUtils.GlobalAdvisory._css;
        
            var el = new Element('div', {'id':id, 'class':css});
            el.setHTML(String.format("<div>{0}</div>", msg));
            el.injectBefore($E(anchor));
        }
    }
}

SysUtils.KeyListener = function(e, buttonSelector) { 
    var ev = new Event(e);    
    var key =  ev.key;

    if (!$chk(buttonSelector)) buttonSelector = "a.submitTarget";

    var targetButton = $E(buttonSelector);
    if((key == "enter") && (targetButton)) { 
    
        if ($(ev.target) && $(ev.target).tagName == 'TEXTAREA') return;
    
    
        // ### RM TESTING
        ev.stop();    

        if (targetButton.disabled) return;

        var targetButtonMethodStr = targetButton.href;  
        var postBackArgs = targetButtonMethodStr.substring(targetButtonMethodStr.indexOf("(")+1,targetButtonMethodStr.length-1).split(","); 
        var onClickMethod = targetButton.onclick; 

        var validateMethod = function(e) {  
            var result = true;
            
            if(typeof(onClickMethod) == "function") { 
                result = onClickMethod(); 
            }
                  
            if(!result)
                new Event(e).stop(); 
            else { 
                /*__doPostBack.call(theForm,postBackArgs[0],postBackArgs[1]);*/
                eval("__doPostBack.call(theForm,"+postBackArgs[0]+","+postBackArgs[1]+");");
            }
        }

        targetButton.removeEvents("click"); 
        targetButton.addEvent("click", validateMethod); 
        
        targetButton.fireEvent("click",e); 
    }
}

SysUtils.FocusHandler = {
    'seeFirst': false,
    
    'init': function() {
        $ES('input.text, select, textarea').each(function(el) { (SysUtils.FocusHandler.register.bind(SysUtils.FocusHandler))(el); });
    },
    
    'register': function(el) {
        if ($chk(el)) {
            if ($type(el) == 'string') {
                this.register($(el));
            }
            else if ($type(el) == 'array') {
                for (var i = 0; i < el.length; i ++) {
                    this.register($(el[i]));
                }
            }
            else if ($type(el) == 'element' && !el.disabled ) {
                this.add(el);
                if ( !SysUtils.FocusHandler.seeFirst  ) {
                    el.focus();
                    SysUtils.FocusHandler.seeFirst = true;
                }
            }
        }
    },
    
    'add': function(el) {
        if (el.tagName.toLowerCase() == 'select' && Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version >= 7 ) {
            el.onactivate = SysUtils.FocusHandler.set.bind(el);
            el.ondeactivate = SysUtils.FocusHandler.unset.bind(el);
        }
        else {
            el.addEvent('focus', SysUtils.FocusHandler.set.bind(el));
            el.addEvent('blur', SysUtils.FocusHandler.unset.bind(el));         
        }
    },
    
    'set': function() {
        this.addClass('focus');
    },
    
    'unset': function() {
        this.removeClass('focus');
    }
};

function doFixPNG() {
    return (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7 && document.body.filters);
}

function fixPNG(myImage) 
{
    if (myImage.getSize().size.x < 1) return;
    
    if (doFixPNG()) {
       var imgID = (myImage.id) ? "id='" + myImage.id + "' " : ""
       var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : "";
       var imgTitle = (myImage.title) ? "title='" + myImage.title  + "' " : "title='" + myImage.alt + "' ";
           
       var imgStyle = "";
       if(myImage.style.cssText!=null){ imgStyle="display:inline-block;" + myImage.style.cssText;}
           
       var strNewHTML = "<span " + imgID + imgClass + imgTitle
              + " style=\"" + "width:" + myImage.width 
              + "px; height:" + myImage.height 
              + "px;" + imgStyle + ";"
              + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
              + "(src=\'" + myImage.src + "\', sizingMethod='scale');\"></span>";
              
        myImage.outerHTML = strNewHTML       
    }
}

window.addEvent("load", function() { 
    if (doFixPNG()) {
        Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function(){$$('img.fixPNG').each(function(el){fixPNG(el);});});        
    }
});

/* Metrics Classes for Omniture */
var Metrics = {
    "_s": {},

    initialize: function(sAccount) {
        this._s = null;
        //default to global s_account variable here. 
        var account = s_account;

        if ($chk(sAccount)) {
            account = sAccount;
        }

        this._s = s_gi(account);
    },
    addOnClickPropObj: function(obj) {
        for (var o in obj) {
            this._s[o] = obj[o];
        }
    },
    sendOnClick: function(obj, type) {
        var onClickType = 'o';

        if ($chk(type)) {
            onClickType = type;
        }

        this._s.tl(obj, onClickType, this._s.pageName);
    }
}

JS.Ford.Sync.Metrics = new Class({
    '_s': {},
    '_onClickProps': {},

    'initialize': function(sAccount, options) {
        this._s = s_gi(sAccount);
        this._s = $extend(this._s, (options || {}))
    },

    'sendOnClick': function(obj, type, pageName) {
        var onClickType = 'o'; //default click type. 
        pageName = $chk(pageName) ? pageName : this._s.pageName;

        if ($chk(type)) {
            onClickType = type;
        }

        this._s.tl(obj, onClickType, pageName);
    }
}); 

function genericSendMetricsOnClick(sProp,linkName,clickType) {   
   
    new JS.Ford.Sync.Metrics(s_account,{
        'prop5' : sProp,
        'linkTrackVars' : 'prop5'
    }).sendOnClick(this,clickType, linkName);
    
}

function genericMetricsWithTitle(sProp) {
    var fnTitle = document.title;
    genericSendMetricsOnClick(sProp + ":" + fnTitle);
}

function genericSendProp6(sProp) {       
    new JS.Ford.Sync.Metrics(s_account,{
        'prop6' : sProp,
        'linkTrackVars' : 'prop6'
    }).sendOnClick(this,'o',sProp); 
}

function genericSendProp7(sProp) {   
    new JS.Ford.Sync.Metrics(s_account,{
        'prop7' : sProp,
        'linkTrackVars' : 'prop7'
    }).sendOnClick(this,'o',sProp); 
}

/*----- Begin: Initialization Functions -----*/
//window.addEvent('domready', Metrics.setOnClicks.bind(Metrics));
/*----- End: Initialization Functions -----*/

SysUtils.FormSubmissionControl = {
    '_scrimID': '_formScrim',
    
    'load': function() {
        $(this._scrimID).setStyles({'width':1, 'height':1});
    },
    
    'submit': function() {
        var _win = window.getSize();
        $(this._scrimID).setStyles({'width':_win.scrollSize.x-30, 'height':_win.scrollSize.y-40});
        return true;
    }
};

window.addEvent("domready",function() { 
    var targetBtn = $E("a.submitTarget");
    
    if(targetBtn != null) { 
        var formElements = $$("input[type=text]","input[type=checkbox]","input[type=password]","select","textarea");
        
        if(formElements.length > 0) { 
            $E("div.mainCont").addEvent("keypress", function(e) { SysUtils.KeyListener(e); });
        }
        else {
            //no form elements exist on the page, so we have to attach the listener to the document.  
            document.onkeypress = SysUtils.KeyListener.bindWithEvent(); 
        }
    }
    
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function() { SysUtils.FormSubmissionControl.load(); });
});


//These functions are used to track child windows and close when needed.
var childWindow;

function openChildWindow(address)
{
    window.childWindow = window.open(address,'toam','width=800,height=600,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no');
}

function closeChildWindow()
{
    if(window.childWindow && !window.childWindow.closed)
    {
        window.childWindow.close();
    }
}

function closeWindow()
{
    self.close();
}

function openPopUpWindow(address, name, opt)
{
    if(name == undefined)
        name = 'toam';

    if(opt == undefined)
        opt = 'width=800,height=600,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no';
        
    window.childWindow = window.open(address,name,opt);
}

function hideAllSelects() {
    if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
        $j('select').each(function() {
            $j(this).hide();
        });
        
        $ES('img.fixPNG').each(function(el) { fixPNG(el); });
    }
    return false;
}

function showAllSelects() {

    if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) {
        $j('select').each(function() {
            $j(this).show();
        });
    }
    return false;
}

/*
FUNCTION: ColumnsEqualHeight
---------------------------
Compares a group of columns and gives them the same height.

PARAMETERS:
==============
columns (Array [Element]) - An array of elements.

USAGE:
=======
ColumnsEqualHeight($$('div.equalize'));
*/
function ColumnsEqualHeight(columns){
	var max_height = 0;
	columns.each(function(col) { 
		max_height = Math.max(col.getSize().scrollSize.y,col.getSize().size.y); 
	});
	
	columns.setStyle('height', max_height);
}

function windowPopup(url, w, h) {

    var left = (screen.width / 2) - (w / 2);
    var top = (screen.height / 2) - (h / 2);
    mywindow = window.open(url, "mywindow",
               "location=0,status=0,scrollbars=1, width=" + w + ", height=" + h + ", top=" + top + ", left=" + left);
}