//this first part is taken from prototype.js
if(!Class) 
{
	var Class = {
	  create: function() {
	    return function() {
	      this.initialize.apply(this, arguments);
	    }
	  }
	}
	Object.extend = function(destination, source) {
	  for (var property in source) {
	    destination[property] = source[property];
	  }
	  return destination;
	}
}

// create MAXX object
var MAXX = {

    init: function() { },

    $get: function(id, element) {
        if (!element) return document.getElementById(id);
        if (element.getElementById) return element.getElementById(id);
    },

    Util: {
        //default pattern is whitespaces(spaces,tabs,new line feeds,etc.)
        IsBlank: function(MyString) {
            var removed = '\\s';
            regExp = eval("/^([" + removed + "]*)$/");
            return regExp.test(MyString);
        },

        // default pattern is whitespaces(spaces,tabs,new line feeds,etc.)
        LTrim: function(MyString, pattern) {
            var retval = "";
            if (!MAXX.Util.IsBlank(MyString)) {
                var removed = (typeof (pattern) == 'undefined') ? '\\s' : pattern;
                regExp = eval("/^(" + removed + "*)([^" + removed + "].*)$/gi");
                retval = MyString.replace(regExp, "$2");
            }
            return retval
        },

        // default pattern is whitespaces(spaces,tabs,new line feeds,etc.)
        RTrim: function(MyString, pattern) {
            var retval = "";
            if (!MAXX.Util.IsBlank(MyString)) {
                var removed = (typeof (pattern) == 'undefined') ? '\\s' : pattern;
                regExp = eval("/^(.*[^" + removed + "])(" + removed + "*)$/gi");
                retval = MyString.replace(regExp, "$1"); ;
            }
            return retval
        },

        // default pattern is whitespaces(spaces,tabs,new line feeds,etc.)
        Trim: function(MyString, pattern) {
            var retval = "";
            if (!MAXX.Util.IsBlank(MyString)) {
                var removed = (typeof (pattern) == 'undefined') ? '\\s' : pattern;
                regExp = eval("/^(" + removed + "*)([^" + removed + "].*[^" + removed + "])(" + removed + "*)$/g");
                retval = MyString.replace(regExp, "$2");
            }
            return retval;
        },

        Replace: function(MyString, SString, RString) {
            var regExp = eval('/' + SString + '/g');
            return MyString.replace(regExp, RString);
        },

        ReplaceNoCase: function(MyString, SString, RString) {
            var regExp = eval('/' + SString + '/gi');
            return MyString.replace(regExp, RString);
        },

        HTMLStrip: function(MyString, RString) {
            RString = typeof RString == "string" ? RString : "";
            return MyString.replace(/(<([^>]+)>)/ig, RString);
        },

        ListDelete: function(str, pattern, limiter) {
            lim = (limiter == undefined) ? ',' : limiter;
            reg1 = "(" + lim + ")(" + pattern + ")(" + lim + ")";
            reg2 = "(^|" + lim + ")(" + pattern + ")(" + lim + "|$)";

            regExpr = new RegExp(reg1, "g");

            while (regExpr.compile(reg1, "g").test(str))
                str = str.replace(regExpr, "$1");

            while (regExpr.compile(reg2, "g").test(str))
                str = str.replace(regExpr, "");

            return str;
        },

        // append new value into a list..
        ListAppend: function(valueList, val, delimiters) {
            delimiters = (typeof (delimiters) == 'undefined') ? ',' : delimiters;
            valueList = (valueList == '') ? val : valueList + delimiters + val;
            return valueList;
        },

        // find list item
        ListFindNoCase: function(valueList, val, delimiters) {
            delimiters = (typeof (delimiters) == 'undefined') ? ',' : delimiters;
            //regExp1=eval("/(^|,)(00)(,|$)/g");   // global search..
            regExp1 = eval("/(^|" + delimiters + ")(" + val + ")(" + delimiters + "|$)/i");   // first match..
            return regExp1.test(valueList);
        },

        // get the random number base on the range of number input
        // function call:	Rand(100);
        Rand: function(range) {
            return randomnumber = Math.floor(Math.random() * range);
        },

        RoundUp: function(number, dec) {
            dec = (typeof (dec) == 'undefined' || isNaN(dec)) ? 0 : dec;
            this.roundNum = '1';
            for (x = 0; x < dec; x++)
                this.roundNum = this.roundNum + '0';
            this.roundNum = parseInt(this.roundNum);
            this.number = Math.round(parseFloat(number) * this.roundNum) / this.roundNum;

            return this.number;
        },
        
        NumberFormat: function(myNumber,mask,commaDistance){
            var myMaskDecimalCount = typeof(mask)=='undefined'? 0 : mask; //var msg = 'myValue orginal: '+myNumber+'\n'+'myMaskDecimalCount: '+myMaskDecimalCount+'\n';
            commaDistance = typeof(commaDistance) == 'undefined'? 3: commaDistance;

            var myValue = myNumber.toString().replace(/,|\s/g,''); // remove ',' and whitespaces //string_replace(new String(myNumber),',',''); 

            myValue = new String(MAXX.Util.RoundUp(myValue,myMaskDecimalCount)); //msg+= 'myValue after rounded: '+myValue+'\n';
            var myNumberDecimalCount = myValue.indexOf('.') != -1 ? myValue.length - myValue.indexOf('.') - 1 : 0; // get pass in value decimal count
            var minusSign = myValue.indexOf('-') != -1 ? '-' : ''; // get negative sign 
            myValue = myValue.replace(/^-/,''); //string_replace(myValue,'-',''); // remove negative sign 

            while(myMaskDecimalCount > myNumberDecimalCount)
            {
                if(myValue.indexOf('.') == -1) myValue+='.';
                myValue += '0';
                myNumberDecimalCount++;
            }
            //msg+= 'myValue after add 0s: '+myValue+'\n'+'myValue.length: '+myValue.length+'\n';
            var myWholeNumberCount = (myNumberDecimalCount==0)?myValue.length:myValue.length-myNumberDecimalCount - 1; // count numbers of digits before decimal period, subtract 1 for the decimal period 
            //msg+= 'myNumberDecimalCount: '+myNumberDecimalCount+'\n'+'myWholeNumberCount: '+myWholeNumberCount+'\n';
            var leftmostDigitsCount = myWholeNumberCount % commaDistance;//msg+= 'leftmostDigitsCount: '+leftmostDigitsCount + '\n';
            var formattedNumber = '';
            for(var i=0; i < myValue.length; i++){
                if(myWholeNumberCount>commaDistance && i>=leftmostDigitsCount && (i%commaDistance==leftmostDigitsCount) && i<myWholeNumberCount && i!=0)
                    formattedNumber+=',';
                formattedNumber+=myValue.charAt(i);
            }

            return minusSign+formattedNumber;
        },        

        // returns true if the string only contains characters 0-9
        IsNumeric: function() {
            var regExp = /^[0-9]+$/g;
            var str = arguments.length == 0 ? String.fromCharCode(event.keyCode) : arguments[0];
            return regExp.test(str);
        },

        // search if a STRING is a valid number including commas (e.g. 300,000,000.99)
        IsNumber: function(str) {
            var regExp = /^-?(\d)*(,\d{3})*([.]\d*)?$/g;
            return (regExp.test(str.toString()));
        },

        IsNegative: function(str) {
            var regExp = /^-(\d)*(,\d{3})*([.]\d*)?$/g;
            return (regExp.test(str.toString()));
        },

        GetCharKey: function() {
            return String.fromCharCode(event.keyCode);
        },

        // Check for valid userid
        IsValidUserId: function(UserID) {
            var regExp = eval("/^([a-zA-Z])([a-zA-Z0-9._-]{3,20})$/");
            return regExp.test(UserID);
        },

        // returns true if the string contains only whitespace
        // cannot check a password type input for whitespace
        IsWhitespace: function(str) { // NOT USED IN FORM VALIDATION
            var regExp = /[\S]/g
            if (regExp.test(str)) return false;
            return true;
        },

        // returns true if the string is a valid date formatted as...
        // mm dd yyyy, mm/dd/yyyy, mm.dd.yyyy, mm-dd-yyyy
        IsDate: function(str) {
            var regExp = /^(\d{1,2})[\s\.\/-](\d{1,2})[\s\.\/-](\d{4})$/
            if (!regExp.test(str)) return false;
            var result = str.match(regExp);
            var m = parseInt(result[1]);
            var d = parseInt(result[2]);
            var y = parseInt(result[3]);
            if (m < 1 || m > 12 || y < 1900 || y > 2100) return false;
            if (m == 2) {
                var days = ((y % 4) == 0) ? 29 : 28;
            }
            else if (m == 4 || m == 6 || m == 9 || m == 11) {
                var days = 30;
            }
            else {
                var days = 31;
            }
            return (d >= 1 && d <= days);
        },

        // returns true if the string is a US phone number formatted as...
        // (000)000-0000, (000) 000-0000, 000-000-0000, 000.000.0000, 000 000 0000, 0000000000
        IsPhoneNumber: function(str) {
            var regExp = /^\(?[2-9]\d{2}[\)\.-]?\s?\d{3}[\s\.-]?\d{4}$/
            return regExp.test(str);
        },

        // returns true if the string only contains characters A-Z or a-z
        IsAlpha: function(str) {
            var regExp = /[^a-zA-Z]/g
            if (regExp.test(str)) return false;
            return true;
        },

        // returns true if the string is a valid email
        IsEmail: function(str) {
            if (MAXX.Util.IsBlank(str)) return false;
            var regExp = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i
            return regExp.test(str);
        },

        // returns true if the string only contains characters A-Z, a-z or 0-9
        IsAlphaNumeric: function(str) {
            var regExp = /[^a-zA-Z0-9]/g
            if (regExp.test(str)) return false;
            return true;
        },

        IsIE: function() {
            return navigator.appName.substring(0, 3).toUpperCase() != "NET";
        },

        GetDocumentSize: function() {
            var documentSize = new Object();
            documentSize.height = document.body.scrollHeight < document.body.offsetHeight ? document.body.offsetHeight : document.body.scrollHeight;
            documentSize.width = document.body.scrollWidth < document.body.offsetWidth ? document.body.offsetWidth : document.body.scrollWidth;
            return documentSize;
        },

        GetScrollPosition: function() {

            var scroll = new Object();
            scroll.left = 0;
            scroll.top = 0;

            //Netscape compliant
            if (typeof (window.pageYOffset) == 'number') {
                scroll.top = window.pageYOffset;
                scroll.left = window.pageXOffset;
            }
            //DOM compliant
            else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
                scroll.top = document.body.scrollTop;
                scroll.left = document.body.scrollLeft;
            }
            //IE6 standards compliant mode
            else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
                scroll.top = document.documentElement.scrollTop;
                scroll.left = document.documentElement.scrollLeft;
            }

            return scroll;
        },

        // find x,y position of an object...
        FindCoordinate: function(obj) {
            var coordinate = new Object();
            coordinate.x = coordinate.y = 0;
            if (obj.offsetParent) {
                coordinate.x = obj.offsetLeft
                coordinate.y = obj.offsetTop
                while (obj = obj.offsetParent) {
                    coordinate.x += obj.offsetLeft
                    coordinate.y += obj.offsetTop
                }
            }
            return coordinate;
        },

        MoveToCoordinate: function(obj, moveObj, x, y) {
            var coordinate = MAXX.Util.FindCoordinate(obj),
                objSize = this.GetObjectSize(obj.id);

            coordinate.x = typeof x == 'undefined' ? coordinate.x + objSize.width + 5 : (coordinate.x + x);
            coordinate.y = typeof y == 'undefined' ? coordinate.y : (coordinate.y + y);

            moveObj.style.left = coordinate.x + 'px';
            moveObj.style.top = coordinate.y + 'px';
            return coordinate;
        },

        // required jquery.js
        IsHideOBJ: function(coor, objID, e) {
            e = (!e) ? window.event : e;
            isClose = false;
            if (coor != null) {
                mouseXY = MAXX.Util.GetScrollPosition();
                mouseX = isIE() ? event.x : e.pageX;
                mouseY = isIE() ? event.y : e.pageY;
                mouseY = (mouseY == 0 || mouseY < mouseXY.top) ? mouseXY.top : mouseY;

                objW = parseInt(coor.x) + parseInt($("#" + objID).width()) + 5;
                objH = parseInt(coor.y) + parseInt($("#" + objID).height()) + 5;
                isClose = ((mouseX < parseInt(coor.x) - 5 || mouseX > objW) || (mouseY < parseInt(coor.y) + 5 || mouseY > objH));
            }
            return isClose;
        },

        GetObjectSize: function(objId) {
            var objSize = new Object();
            var obj = $('#' + objId).get(0);
            objSize.width = $(obj).width();
            objSize.height = $(obj).height();
            return objSize;
        },

        ChangeColor: function(cName, obj) {
            obj.className = cName;
        },

        DisabledAll: function(isDisabled) {
            var formIndex = arguments.length == 1 ? 0 : arguments[1];
            for (x = 0; x < document.forms[formIndex].length; x++) {
                document.forms[formIndex][x].disabled = isDisabled;
            }
        },

        ShowHideObject: function(obj, show) {
            if (typeof (obj) == 'string') {
                document.getElementById(obj).style.display = show ? 'block' : 'none';
            }
            else if (typeof (obj) == 'object') {
                obj.style.display = show ? 'block' : 'none';
            }
        },

        // function call: MAXX.Util.RemoveJSCSSFile('default.css', 'css');  //remove specify css file on page.
        // function call: MAXX.Util.RemoveJSCSSFile('util.js', 'js');  //remove specify javascript file on page.
        RemoveJSCSSFile: function(FileName, FileType) {
            FileType = FileType.toLowerCase();
            var TagName = FileType == "js" ? "script" : FileType == "css" ? "link" : "none",
				FileAttribute = TagName == "script" ? "src" : TagName == "link" ? "href" : "none",
				TagObj = document.getElementsByTagName(TagName);

            for (var i = TagOBJ.length; i >= 0; i--) {
                if (TagOBJ[i] && TagOBJ[i].getAttribute(FileAttribute) != null && TagOBJ[i].getAttribute(FileAttribute).indexOf(FileName) != -1)
                    TagOBJ[i].parentNode.removeChild(TagOBJ[i]); // remove element now
            }
        },

        CreateJSCSSFile: function(FileName, FileType) {
            FileType = FileType.toLowerCase();
            var TagName = FileType == "js" ? "script" : FileType == "css" ? "link" : "none",
				NewTag = document.createElement(TagName);

            switch (FileType) {
                case "js":
                    NewTag.setAttribute("type", "text/javascript");
                    NewTag.setAttribute("src", FileName);
                    break;
                case "css":
                    NewTag.setAttribute("rel", "stylesheet");
                    NewTag.setAttribute("type", "text/css");
                    NewTag.setAttribute("href", FileName);
                    break;
                default:
                    break;
            }
            return NewTag;
        },

        // function call: MAXX.Util.ReplaceJSCSSFile('default.css', 'new.css', 'css');  //replace specify css file on page.
        // function call: MAXX.Util.ReplaceJSCSSFile('util.js', 'new.js', 'js');  //replace specify javascript file on page.
        ReplaceJSCSSFile: function(OldFileName, NewFileName, FileType) {
            FileType = FileType.toLowerCase();
            var TagName = FileType == "js" ? "script" : FileType == "css" ? "link" : "none",
				FileAttribute = TagName == "script" ? "src" : TagName == "link" ? "href" : "none"; //,
            TagObj = document.getElementsByTagName(TagName);
            for (var i = TagObj.length; i >= 0; i--) {
                if (TagObj[i] && TagObj[i].getAttribute(FileAttribute) != null && TagObj[i].getAttribute(FileAttribute).indexOf(OldFileName) != -1) {
                    var NewTag = MAXX.Util.CreateJSCSSFile(NewFileName, FileType);
                    TagObj[i].parentNode.replaceChild(NewTag, TagObj[i]); // replace element now
                }
            }
        },
        
        OnChanged: function(obj){
            if (obj.hasAttribute) { // Firefox       
                if(obj.hasAttribute("onchange")){ obj.onchange(); }   
            }
            else if (obj.onchange) { // IE       
                var newEvt = document.createEventObject();       
                obj.fireEvent("onchange", newEvt);   
            }   
        }

    },

    CreditCard: {
        IsValid: function(CardNumber){
	        // Encoding only works on cards with less than 19 digits	
	        if (CardNumber.length > 19 || CardNumber.length < 12 || !MAXX.Util.IsNumeric(CardNumber)) return false;  
        	
	        var sum = 0;
            for (var i = 0; i < CardNumber.length - 1; i++) {
                var weight = CardNumber.substr(CardNumber.length - (i + 2), 1) * (2 - (i % 2));
                sum += ((weight < 10) ? weight : (weight - 9));
            }
            return parseInt(CardNumber.substr(CardNumber.length - 1)) == ((10 - sum % 10) % 10);
        }   
    },

    /****************************************** Ajax utility ******************************************/
    AJAX: {

        GetXmlHttpObject: function() {
            var xmlHttp = null;
            try {
                // Firefox, Opera 8.0+, Safari
                xmlHttp = new XMLHttpRequest();
            }
            catch (e) {
                // Internet Explorer
                try {
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch (e) {
                    try {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    catch (e) {
                        xmlHttp = null;
                        alert("Your browser does not support AJAX!");
                    }
                }
            }
            return xmlHttp;
        },

        // synchronous Ajax request.
        // function call: SynchPostRequest(url) or SynchPostRequest(url, params) or SynchPostRequest(url, params, container)
        SynchPostRequest: function(url) {
            var ajaxREQ = MAXX.AJAX.GetXmlHttpObject();
            if (ajaxREQ == null) return false;
            var ajaxStart = "********* AJAX START *********";
            var params = arguments[1] ? arguments[1] : "";
            ajaxREQ.open('POST', url, false);
            ajaxREQ.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            ajaxREQ.setRequestHeader("Content-length", params.length);
            ajaxREQ.setRequestHeader("Connection", "close");
            ajaxREQ.send(params);
            var json = "";
            if (ajaxREQ.readyState == 4 && ajaxREQ.status == 200) {
                if (arguments.length == 3)
                    document.getElementById(arguments[2]).innerHTML = ajaxREQ.responseText.substring(ajaxREQ.responseText.indexOf(ajaxStart) + ajaxStart.length, ajaxREQ.responseText.length);
                else if (arguments.length == 2)
                    json = ajaxREQ.responseText.substring(ajaxREQ.responseText.indexOf(ajaxStart) + ajaxStart.length, ajaxREQ.responseText.length);
            }
            return json;
        },

        // asynchronous Ajax request.
        // function call: AsynchPostRequest(url, params, ObjArg)
        // url = "ajaxtemplate.cfm";
        // params = "?arg1=1&arg2=2";
        // ObjArg = innerHTML container or function
        AsynchPostRequest: function(url, params, ObjArg) {
            var ajaxREQ = MAXX.AJAX.GetXmlHttpObject();
            if (ajaxREQ == null) return false;
            var ajaxStart = "********* AJAX START *********";
            params = arguments[1] ? arguments[1] : "";
            ajaxREQ.open('POST', url, true);
            ajaxREQ.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            ajaxREQ.setRequestHeader("Content-length", params.length);
            ajaxREQ.setRequestHeader("Connection", "close");
            ajaxREQ.onreadystatechange = function() {
                if (ajaxREQ.readyState == 4 && ajaxREQ.status == 200) {
                    var HTTPContent = ajaxREQ.responseText.indexOf(ajaxStart) == -1 ? ajaxREQ.responseText : ajaxREQ.responseText.substring(ajaxREQ.responseText.indexOf(ajaxStart) + ajaxStart.length, ajaxREQ.responseText.length);
                    if (typeof ObjArg == "function")
                        ObjArg(ajaxREQ.responseText.substring(ajaxREQ.responseText.indexOf(ajaxStart) + ajaxStart.length, ajaxREQ.responseText.length));
                    else
                        document.getElementById(ObjArg).innerHTML = ajaxREQ.responseText.substring(ajaxREQ.responseText.indexOf(ajaxStart) + ajaxStart.length, ajaxREQ.responseText.length);
                }
            }
            ajaxREQ.send(params);
        }
    },

    /****************************************** Dim the whole page ******************************************/
    DimMe: {
        init: function() {
            this.opacity = 50;  // from 1 to 100
            this.backgroundColor = "white";
            this.dimmer = "dimmer";

            // check browser
            this.isMozilla = (document.all) ? 0 : 1;

            if (this.isMozilla) {
                document.captureEvents(Event.RESIZE | Event.SCROLL | Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
            }

            window.onresize = MAXX.DimMe.Resize;
            // add the div
            document.write('<div id="' + this.dimmer + '" class="' + this.dimmer + '" style="z-index: 500; visibility:hidden; position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:' + this.backgroundColor + '; filter:alpha(opacity=' + this.opacity + ');opacity:' + (this.opacity / 100) + ';"></div>');

        },

        Resize: function() {
            var documentHeight = document.body.scrollHeight < document.body.offsetHeight ? document.body.offsetHeight : document.body.scrollHeight;
            document.getElementById(MAXX.DimMe.dimmer).style.height = documentHeight + "px";
        },

        ShowDimmer: function() {
            MAXX.DimMe.Resize();
            document.getElementById(MAXX.DimMe.dimmer).style.visibility = "visible";
        },

        HideDimmer: function() {
            document.getElementById(MAXX.DimMe.dimmer).style.visibility = 'hidden';
        }
    },

    /****************************************** drag dialog box ******************************************/
    // function call to show dialog: DialogWindow.ShowDialog('PopupModal');
    // function call to hide dialog: DialogWindow.HideDialog('PopupModal');
    // drag header: onmouseover="DialogWindow.over=true;" onmouseout="DialogWindow.over=false;"
    DialogWindow: {
        init: function() {

            this.objDiv = null;
            this.originalDivHTML = "";
            this.DivID = "";
            this.over = false;

            // check browser
            this.isMozilla = (document.all) ? 0 : 1;
            if (this.isMozilla) {
                document.captureEvents(Event.RESIZE | Event.SCROLL | Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
            }

            document.onmousedown = DialogWindow.MouseDown;
            document.onmousemove = DialogWindow.MouseMove;
            document.onmouseup = DialogWindow.MouseUp;
            window.onresize = DialogWindow.Resize;
        },

        Resize: function() {
            //var documentHeight = document.body.scrollHeight < document.body.offsetHeight ? document.body.offsetHeight : document.body.scrollHeight;
            //document.getElementById("dimmer").style.height = documentHeight + "px";	
        },

        MouseDown: function(e) {
            if (DialogWindow.over) {
                if (DialogWindow.isMozilla) {
                    DialogWindow.objDiv = document.getElementById(DialogWindow.DivID);
                    X = e.layerX;
                    Y = e.layerY;
                    return false;
                }
                else {
                    DialogWindow.objDiv = document.getElementById(DialogWindow.DivID);
                    DialogWindow.objDiv = DialogWindow.objDiv.style;
                    X = event.offsetX;
                    Y = event.offsetY;
                }
            }
        },

        MouseMove: function(e) {
            if (DialogWindow.objDiv) {
                if (DialogWindow.isMozilla) {
                    DialogWindow.objDiv.style.top = (e.pageY - Y) + 'px';
                    DialogWindow.objDiv.style.left = (e.pageX - X) + 'px';
                    return false;
                }
                else {
                    DialogWindow.objDiv.pixelLeft = event.clientX - X + document.body.scrollLeft;
                    DialogWindow.objDiv.pixelTop = event.clientY - Y + document.body.scrollTop;
                    return false;
                }
            }
        },

        MouseUp: function() {
            DialogWindow.objDiv = null;
        },

        HideDialog: function(divId) {
            document.getElementById(divId).innerHTML = this.originalDivHTML;
            document.getElementById(divId).style.visibility = 'hidden';
            DimMe.HideDimmer();
            this.DivID = "";
        },

        ShowDialog: function(divId) {
            this.DivID = divId;
            DimMe.ShowDimmer();
            document.getElementById(divId).style.visibility = "visible";
        }
    }

};

MAXX.init();


