FiftyHeaderCore = function()
{
    var previewCartLink = null;
	var instancePreviewShoppingCartModule = null;
	var instanceOrderedProductModule = null;
	var processorUrl = null;
	var self = null;
	var contentOrderedProductsHtml = null;
	var orderedProductIdArray = null;
    var myLoginCurrentMembersModule=null;
    var myLivePersonChatModule = null;
    var pageTaggerModuleInstance = null;
	var instanceHeaderLinksModule = null;
	var instanceFooterSignupFormModule = null;
	
	var keyConstants = {
		"BACKSPACE": 8,
		"DASH": 45,
		"TAB": 9,
		"UP_DOWN_LEFT_RIGHT_TAB_DELETE_KEYS_FIREFOX": 0,
		"DELETE": 127,
		"NUMBER_0": 48,
		"NUMBER_9": 57,
		"SLASH" : 47
	};
	
    this.init = function()
    {
        //processorUrl = "../model/FiftyHeader_MDL.php";
        processorUrl = location.protocol + "//" + location.hostname + "/model/FiftyHeader_MDL.php";
		self = this;
		orderedProductIdArray = new Array();
		previewCartLink = document.getElementById('preview_cart');
        var cookieValue = self.readCookie("preview-cart");
        //addListener for previewCartLink
        var listener = this.addListener(previewCartLink, 'click', previewShoppingCartModule_Click, self, true);
        if(cookieValue == "open" && listener == true)
        {
            previewShoppingCartModule_Click();
        }
        else
        {
            if(listener == false)
            {
                options = {path: "/"};
                this.deleteCookie("preview-cart",options);
            }
        }
        startLivePersonChatModuleHandler();
        startPageTaggerModuleHandler();
        pageTaggerModuleInstance.tagFirstTimeVisitor();
		startHeaderLinksModuleHandler();
		startFooterSignupFormModuleHandler();
    };

    var previewShoppingCartModule_Click = function()
    {
        var cookieValue = self.readCookie("preview-cart");
        
        if(cookieValue == null)
        {
            options = {path: "/"};
            self.setCookie("preview-cart","open",options);
        }
        
        instancePreviewShoppingCartModule = null;
		var sandbox = new FiftyHeaderSandbox();
        sandbox.init(self);
		var myContext = self.getXY(previewCartLink);//Shopping Cart link
        var data = {
			myContextX: myContext[0]+145,
			myContextY: myContext[1]-15
		};
		instancePreviewShoppingCartModule = createPreviewShoppingCartModule("PreviewShoppingCartModule",data,sandbox);
    };
    
    var createPreviewShoppingCartModule = function(moduleId_p, data_p, sandbox_p)
    {
        var instance = null;
        instance = new PreviewShoppingCartModule();
        instance.init(moduleId_p, data_p, sandbox_p);
        return instance;
    };
    
    var createOrderedProductModule = function(moduleId_p, data_p, sandbox_p)
    {
        var instance = null;
        instance = new OrderedProductModule();
        instance.init(moduleId_p, data_p, sandbox_p);
        return instance;
    };

    //////////////////////////////////////////////////
    //Start functions to handle Liveperson Chat module
    //////////////////////////////////////////////////
    var createLivePersonChatModule = function(moduleId_p,data_p,sandbox_p)
    {
        var instance = null;
	    instance = new LivePersonChatModule();
	    instance.init(moduleId_p,data_p,sandbox_p);
	    return instance;

    };
	var startLivePersonChatModuleHandler = function()
    {
       	var data_p = null;
		var sandbox = new FiftyHeaderSandbox();
        sandbox.init(self);
        myLivePersonChatModule = createLivePersonChatModule("livePersonChatModuleId", data_p, sandbox);
    };
    //////////////////////////////////////////////////
    //End functions to handle Liveperson Chat module
    //////////////////////////////////////////////////
    //////////////////////////////////////////////////
    //Start functions to handle PageTagger module
    //////////////////////////////////////////////////
    var createPageTaggerModule = function(moduleId_p,data_p,sandbox_p)
    {
        var instance = null;
	    instance = new PageTaggerModule();
	    instance.init(moduleId_p,data_p,sandbox_p);
	    return instance;

    };
	var startPageTaggerModuleHandler = function()
    {
       	var data_p = null;
        var sandbox = new FiftyHeaderSandbox();
        sandbox.init(self);
        pageTaggerModuleInstance = createPageTaggerModule("PageTaggerModuleId", data_p, sandbox);
    };
    //////////////////////////////////////////////////
    //End functions to handle PageTagger module
    //////////////////////////////////////////////////
	//////////////////////////////////////////////////
    //Start functions to handle HeaderLinks module
    //////////////////////////////////////////////////
	var createHeaderLinksModule = function(moduleId_p,data_p,sandbox_p)
	{
		var instance = null;
		instance = new HeaderLinksModule();
		instance.init(moduleId_p,data_p,sandbox_p);
		return instance;
	}

	var startHeaderLinksModuleHandler = function()
	{
		var data_p = null;
		var sandbox_p = new FiftyHeaderSandbox();
		sandbox_p.init(self);
		instanceHeaderLinksModule = createHeaderLinksModule("HeaderLinksModuleId",data_p,sandbox_p);
	}
	//////////////////////////////////////////////////
    //End functions to handle HeaderLinks module
    //////////////////////////////////////////////////
	//////////////////////////////////////////////////
    //Start functions to handle FooterSignupForm module
    //////////////////////////////////////////////////
	var createFooterSignupFormModule = function(moduleId_p,data_p,sandbox_p)
	{
		var instance = null;
		instance = new FooterSignupFormModule();
		instance.init(moduleId_p,data_p,sandbox_p);
		return instance;
	}

	var startFooterSignupFormModuleHandler = function()
	{
		var data_p = null;
		var sandbox_p = new FiftyHeaderSandbox();
		sandbox_p.init(self);
		instanceFooterSignupFormModule = createFooterSignupFormModule("FooterSignupFormModuleId",data_p,sandbox_p);
	}
	//////////////////////////////////////////////////
    //End functions to handle FooterSignupForm module
    //////////////////////////////////////////////////
	var updateTextOnShoppingCartLink = function()
	{
		var myObject = document.getElementById('cart_link');
		myObject.innerHTML = 'Shopping Cart ('+orderedProductIdArray.length+')';
	};
	
	var startOrderedProductModule = function()
	{
		instanceOrderedProductModule = new Array();
		instanceOrderedProductModule.length = 0;
		if(orderedProductIdArray.length > 0)
		{
			var sliderMaskObject = document.getElementById('sliderMask');
			var contentOrderedProductsObject = document.getElementById('content-ordered-products');
			for(x in orderedProductIdArray)
			{
				var sandbox = new FiftyHeaderSandbox();
				sandbox.init(self);
				var orderedProductId = orderedProductIdArray[x];
				var data = {
					orderedProductId: orderedProductId,
					contentOrderedProductsObject: contentOrderedProductsObject,
					sliderMaskObject: sliderMaskObject
				};
				instanceOrderedProductModule['OrderedProductModule_'+orderedProductId] = createOrderedProductModule("OrderedProductModule_"+orderedProductId,data,sandbox);
			}
		}
	};
	var getHtmlForOrderedProductModules_success = function(o)
	{
		var data = null;
        try {
            data = this.jsonParse(o.responseText);    
        }
        catch(x) {
            alert("Failure on: getHtmlForOrderedProduct_success. " + x);
        }
		var orderedProductIdArrayLength = orderedProductIdArray.length;
		instancePreviewShoppingCartModule.setContentOrderedProducts(data['html'],orderedProductIdArrayLength);
	};
	
	var getHtmlForOrderedProductModules_failure = function()
	{
		alert('Error on: getHtmlForOrderedProductModules function');
	};
	
	var getHtmlForOrderedProductModules = function()
	{
        var method = 'POST';
        var url = processorUrl;
        var scope = self;
        var success = getHtmlForOrderedProductModules_success;
        var failure = getHtmlForOrderedProductModules_failure;
        var postData = "action=getHtmlForOrderedProductModules&orderedProductIdArray="+orderedProductIdArray;
        var handleEvent = {
            method:method,
            url:url,
            scope:scope,
            success:success,
            failure:failure,
            postData:postData
        };
        self.ajaxRequest(handleEvent);
	};
    
	var getHtmlForEmptyCart_success = function(o)
	{
		var data = null;
        try {
            data = this.jsonParse(o.responseText);    
        }
        catch(x) {
            alert("Failure on: getHtmlForNoProductsInCart_success. " + x);
        }
		instancePreviewShoppingCartModule.setContentEmptyCart(data['html']);
	};
	
	var getHtmlForEmptyCart_failure = function()
	{
		alert('Error on getHtmlForEmptyCart function');
	};
	
	var getHtmlForEmptyCart = function()
	{
        var method = 'POST';
        var url = processorUrl;
        var scope = self;
        var success = getHtmlForEmptyCart_success;
        var failure = getHtmlForEmptyCart_failure;
        var postData = "action=getHtmlForEmptyCart";
        var handleEvent = {
            method:method,
            url:url,
            scope:scope,
            success:success,
            failure:failure,
            postData:postData
        };
        self.ajaxRequest(handleEvent);		
	};
	
	var evaluateOrderedProductIds = function(orderedProductIds)
	{
		orderedProductIdArray.length = 0;//global variable initialize with length 0
		orderedProductIdArray = orderedProductIds;
		if(orderedProductIdArray.length > 0)
		{
			getHtmlForOrderedProductModules();
		}
		else
		{
			getHtmlForEmptyCart();
		}
	};
	/*
	this.getOrderedProductIdArray = function()
	{
		return orderedProductIdArray;
	};
	
	this.getInstanceOrderedProductModule = function()
	{
		return instanceOrderedProductModule;	
	};
	*/
	
    //////////////////////////////////////////////////
    //Start functions that are called from sandbox
    //////////////////////////////////////////////////
    this.addListener = function(htmlObject_p, eventType_p, fnCallback_p, myObject_p, scopeObject_p)
    {
        return YAHOO.util.Event.addListener(htmlObject_p, eventType_p, fnCallback_p, myObject_p, scopeObject_p);
    };

	this.removeListener = function(htmlObject_p,eventType_p,fnCallback_p)
	{
		return YAHOO.util.Event.removeListener(htmlObject_p,eventType_p,fnCallback_p);
	};

    this.ajaxRequest = function(handleEvent_p)
    {
	    var callback = null;
	    var method = handleEvent_p.method;
	    var url = handleEvent_p.url;
	    var postData = handleEvent_p.postData;
	    if(handleEvent_p.scope == null)
	    {
		    callback = {
			    success: handleEvent_p.success,
			    failure: handleEvent_p. failure,
			    argument: handleEvent_p.argument
		    };
	    }
	    else
	    {
		    callback = {
			    success: handleEvent_p.success,
			    failure: handleEvent_p. failure,
			    scope: handleEvent_p.scope,
			    argument: handleEvent_p.argument
		    };
	    }
	    return YAHOO.util.Connect.asyncRequest(method, url, callback, postData);
    };
    
    this.addClass = function(objectId_p, className_p)
    {
        return YAHOO.util.Dom.addClass(objectId_p, className_p);
    };
    
    this.removeClass = function(objectId_p, className_p)
    {
        return YAHOO.util.Dom.removeClass(objectId_p, className_p);
    };    
    
    this.replaceClass = function(objectId_p, oldClassName_p, newClassName_p)
    {
        return YAHOO.util.Dom.replaceClass(objectId_p, oldClassName_p, newClassName_p);  
    };
    
	this.get = function(objectId_p)
	{
		return YAHOO.util.Dom.get(objectId_p);
	}
	
    this.jsonParse = function(jsonObject_p)
    {
        return YAHOO.lang.JSON.parse(jsonObject_p);
    };

    this.handleNotification = function(event_p,data_p)
    {
        switch(event_p)
        {
            case 'ordered-products-ready-preview-shopping-cart':
						evaluateOrderedProductIds(data_p['orderedProductIds']);
						break;
			case 'ordered-products-ready-set-content':
						updateTextOnShoppingCartLink();
						startOrderedProductModule();
						break;
			case 'empty-cart-ready-set-content':
						updateTextOnShoppingCartLink();
						break;
			case 'ordered-product-removed-from-preview-shopping-cart':
						instancePreviewShoppingCartModule.getOrderedProductIds();
						break;
            default:
                        break;
        }
    };

    this.onContentReady = function(moduleId_p, fnHandler, data, scope)
    {
        return YAHOO.util.Event.onContentReady(moduleId_p, fnHandler, data, scope);
    };
    
    this.selectorQuery = function(selector_p,root_p,firstOnly_p)
    {
		return YAHOO.util.Selector.query(selector_p,root_p,firstOnly_p);
    };

	this.removeChild = function(parent_p,child_p)
	{
		var el = new YAHOO.util.Element(parent_p);//create a YUI element
		return el.removeChild(child_p);
	};
	
	this.getViewportHeight = function()
	{
		return YAHOO.util.Dom.getViewportHeight();
	};
	
	this.setStyle = function(element_p, property_p, value_p)
	{
		return YAHOO.util.Dom.setStyle(element_p, property_p, value_p);		
	};
	
	this.hasClass = function(element_p, className_p)
	{
		return YAHOO.util.Dom.hasClass(element_p, className_p);
	};
    
    this.getXY = function(element_p)
    {
        return YAHOO.util.Dom.getXY(element_p);
    };
	
	this.getX = function(element_p)
	{
		return YAHOO.util.Dom.getX(element_p);
	};
	
	this.getY = function(element_p)
	{
		return YAHOO.util.Dom.getY(element_p);
	};

	this.motion = function(element_p, attributes_p, duration_p, method_p)
	{
		var myMotion = new YAHOO.util.Motion(element_p, attributes_p, duration_p, method_p);
		return myMotion;
	};

	this.setXY = function(element_p, position_p, noRetry_p)
	{
		return YAHOO.util.Dom.setXY(element_p,position_p, noRetry_p);
	};

	this.setCookie = function(name,value,options)
    {
        YAHOO.util.Cookie.set(name,value,options);
    }
    
    this.readCookie = function(name)
    {
        return YAHOO.util.Cookie.get(name);
    }
     
    this.deleteCookie = function(name,options)
    {
        YAHOO.util.Cookie.remove(name,options);
    };
    this.newModuleInstance = function(name_p)
    {
        return new YAHOO.widget.Module(name_p);
    };

    this.newOverlayInstance = function(objectName,data)
    {
        return new YAHOO.widget.Overlay(objectName,data); //effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:1}
    };
    this.stringify = function(ffvisitor)
	{
		return YAHOO.lang.JSON.stringify(ffvisitor);
	};
	this.stopEvent = function(e)
	{
		YAHOO.util.Event.stopEvent(e);
	};
	this.Calendar = function(container,config)
	{
		return new YAHOO.widget.Calendar(container,config);
	};
	this.Dialog = function(container,config)
	{
		return new YAHOO.widget.Dialog(container,config);
	};
	this.isAncestor = function(haystack,needle)
	{
		return YAHOO.util.Dom.isAncestor(haystack,needle);
	};
	this.getTarget = function(e)
	{
		return YAHOO.util.Event.getTarget(e);
	};
	this.EventOn = function(el,sType,fn,obj,overrideContext)
	{
		return YAHOO.util.Event.on(el,sType,fn,obj,overrideContext);
	};
   	//Copied on August 4th 2010
    this.base64_encode = function(data)
    {
        // http://kevin.vanzonneveld.net
        // +   original by: Tyler Akins (http://rumkin.com)
        // +   improved by: Bayron Guevara
        // +   improved by: Thunder.m
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +   bugfixed by: Pellentesque Malesuada
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // -    depends on: utf8_encode
        // *     example 1: base64_encode('Kevin van Zonneveld');
        // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='

        // mozilla has this native
        // - but breaks in 2.0.0.12!
        //if (typeof this.window['atob'] == 'function') {
        //    return atob(data);
        //}

        var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];

        if (!data) {
            return data;
        }

        //data = this.utf8_encode(data+'');
        data = this.utf8_encode(data+'');

        do { // pack three octets into four hexets
            o1 = data.charCodeAt(i++);
            o2 = data.charCodeAt(i++);
            o3 = data.charCodeAt(i++);

            bits = o1<<16 | o2<<8 | o3;

            h1 = bits>>18 & 0x3f;
            h2 = bits>>12 & 0x3f;
            h3 = bits>>6 & 0x3f;
            h4 = bits & 0x3f;

            // use hexets to index into b64, and append result to encoded string
            tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
        } while (i < data.length);

        enc = tmp_arr.join('');

        switch (data.length % 3) {
            case 1:
                enc = enc.slice(0, -2) + '==';
            break;
            case 2:
                enc = enc.slice(0, -1) + '=';
            break;
        }

        return enc;
    }
    this.utf8_encode = function  ( argString ) {
        // http://kevin.vanzonneveld.net
        // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +   improved by: sowberry
        // +    tweaked by: Jack
        // +   bugfixed by: Onno Marsman
        // +   improved by: Yves Sucaet
        // +   bugfixed by: Onno Marsman
        // +   bugfixed by: Ulrich
        // *     example 1: utf8_encode('Kevin van Zonneveld');
        // *     returns 1: 'Kevin van Zonneveld'

        var string = (argString+''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");

        var utftext = "";
        var start, end;
        var stringl = 0;

        start = end = 0;
        stringl = string.length;
        for (var n = 0; n < stringl; n++) {
            var c1 = string.charCodeAt(n);
            var enc = null;

            if (c1 < 128) {
                end++;
            } else if (c1 > 127 && c1 < 2048) {
                enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
            } else {
                enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
            }
            if (enc !== null) {
                if (end > start) {
                    utftext += string.substring(start, end);
                }
                utftext += enc;
                start = end = n+1;
            }
        }

        if (end > start) {
            utftext += string.substring(start, string.length);
        }
        return utftext;
    }

    this.base64_decode = function(data) {// downloaded from  http://phpjs.org/
        // http://kevin.vanzonneveld.net
        // +   original by: Tyler Akins (http://rumkin.com)
        // +   improved by: Thunder.m
        // +      input by: Aman Gupta
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +   bugfixed by: Onno Marsman
        // +   bugfixed by: Pellentesque Malesuada
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +      input by: Brett Zamir (http://brett-zamir.me)
        // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // -    depends on: utf8_decode
        // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
        // *     returns 1: 'Kevin van Zonneveld'

        // mozilla has this native
        // - but breaks in 2.0.0.12!
        //if (typeof this.window['btoa'] == 'function') {
        //    return btoa(data);
        //}

        var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];

        if (!data) {
            return data;
        }

        data += '';

        do {  // unpack four hexets into three octets using index points in b64
            h1 = b64.indexOf(data.charAt(i++));
            h2 = b64.indexOf(data.charAt(i++));
            h3 = b64.indexOf(data.charAt(i++));
            h4 = b64.indexOf(data.charAt(i++));

            bits = h1<<18 | h2<<12 | h3<<6 | h4;

            o1 = bits>>16 & 0xff;
            o2 = bits>>8 & 0xff;
            o3 = bits & 0xff;

            if (h3 == 64) {
                tmp_arr[ac++] = String.fromCharCode(o1);
            } else if (h4 == 64) {
                tmp_arr[ac++] = String.fromCharCode(o1, o2);
            } else {
                tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
            }
        } while (i < data.length);

        dec = tmp_arr.join('');
        dec = this.utf8_decode(dec);

        return dec;
    }

    this.utf8_decode =function( str_data ) {
        // http://kevin.vanzonneveld.net
        // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
        // +      input by: Aman Gupta
        // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // +   improved by: Norman "zEh" Fuchs
        // +   bugfixed by: hitwork
        // +   bugfixed by: Onno Marsman
        // +      input by: Brett Zamir (http://brett-zamir.me)
        // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
        // *     example 1: utf8_decode('Kevin van Zonneveld');
        // *     returns 1: 'Kevin van Zonneveld'

        var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;

        str_data += '';

        while ( i < str_data.length ) {
            c1 = str_data.charCodeAt(i);
            if (c1 < 128) {
                tmp_arr[ac++] = String.fromCharCode(c1);
                i++;
            } else if ((c1 > 191) && (c1 < 224)) {
                c2 = str_data.charCodeAt(i+1);
                tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = str_data.charCodeAt(i+1);
                c3 = str_data.charCodeAt(i+2);
                tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }

        return tmp_arr.join('');
    }
	
	this.phoneNumberChars = function(e,obj)
    {
		var key = (document.all) ? e.keyCode : e.which;
        // see the values on http://www.asciitable.com/
		if (key == keyConstants.BACKSPACE || key == keyConstants.TAB || key == keyConstants.DASH || key == keyConstants.DELETE || (key >= keyConstants.NUMBER_0 && key <= keyConstants.NUMBER_9) || key == keyConstants.UP_DOWN_LEFT_RIGHT_TAB_DELETE_KEYS_FIREFOX)
		{
			return true;
		}
        else
        {
            this.stopEvent(e);
			return false;
        }
    };
	
	this.isValidTelephoneNumber = function(strPhone)
    {
		var phoneNumberDelimiters = "-";
        var totalDigitsInPhoneNumber = 10; //forget international, we only take orders from US and Canada
        s=stripCharsInBag(strPhone,phoneNumberDelimiters);
		var firstCharacter = strPhone.substring(0,1);
		var lastCharacter = strPhone.substring(strPhone.length-1,strPhone.length);
		var doubleHayphen = strPhone.indexOf("--");
        return (isInteger(s) && s.length == totalDigitsInPhoneNumber && firstCharacter != "-" && lastCharacter != "-" && doubleHayphen == -1);
    }
	
	var isInteger = function(s)
    {
        var i;
        for (i = 0; i < s.length; i++)
        {   
            // Check that current character is number.
            var c = s.charAt(i);
            if (((c < "0") || (c > "9"))) return false;
        }
        // All characters are numbers.
        return true;
    };
	
	var stripCharsInBag = function(s, bag)
    {
        var i;
        var returnString = "";
        // Search through string's characters one by one.
        // If character is not in bag, append to returnString.
        for (i = 0; i < s.length; i++)
        {   
            // Check that current character isn't whitespace.
            var c = s.charAt(i);
            if (bag.indexOf(c) == -1) returnString += c;
        }
        return returnString;
    };
	
	this.dateChars = function(e,obj)
	{
		var key = (document.all) ? e.keyCode : e.which;
        // see the values on http://www.asciitable.com/
		if (key == keyConstants.BACKSPACE || key == keyConstants.TAB || key == keyConstants.DELETE || key == keyConstants.SLASH ||(key >= keyConstants.NUMBER_0 && key <= keyConstants.NUMBER_9) || key == keyConstants.UP_DOWN_LEFT_RIGHT_TAB_DELETE_KEYS_FIREFOX)
		{
			return true;
		}
        else
        {
            this.stopEvent(e);
			return false;
        }
	};
	
	this.isValidDate = function(dateStr, format)
	{
		if (format == null) { format = "MDY"; }
		format = format.toUpperCase();
		if (format.length != 3)
		{ format = "MDY"; }
		if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) )
		{ format = "MDY"; }
		if (format.substring(0, 1) == "Y") { // If the year is first
		   var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
		   var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
		} else if (format.substring(1, 2) == "Y") { // If the year is second
		   var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
		   var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
		} else { // The year must be third
		   var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
		   var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
		}
		// If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
		if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
		var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
		// Check to see if the 3 parts end up making a valid date
		if (format.substring(0, 1) == "M") { var mm = parts[0]; }
		else if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
		if (format.substring(0, 1) == "D") { var dd = parts[0]; }
		else if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
		if (format.substring(0, 1) == "Y") { var yy = parts[0]; }
		else if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
		if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
		if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
		var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
		if (parseFloat(dd) != dt.getDate()) { return false; }
		if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
		return true;
	}
	
	this.isValidEmail = function(emailStr)
	{
		var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		return emailPattern.test(emailStr);
	}
	
	this.hasOnlyLetters = function(e,obj)
    {
		var key = (document.all) ? e.keyCode : e.which;
        // se the values on http://www.asciitable.com/
		if(key == 0 || key == 8 || key == 26 || key == 32 || key == 39 || key == 127 || (key > 64 && key < 91) || (key > 96 && key < 123))
		{
			return true;
		}
        else
        {
            this.stopEvent(e);
			return false;
        }
    };

	
    //////////////////////////////////////////////////
    //End functions that are called from sandbox
    //////////////////////////////////////////////////
};
