//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() { },
	
	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); 
		},
		
		// remove the list item..
		/*
		ListDelete : function (valueList, val, delimiters){
			delimiters = (typeof(delimiters) == 'undefined') ? ',' : delimiters;
			var regExp=eval('/'+
							delimiters+val+delimiters+ // between 2 ',' e.g: ",56,"
							'|^'+val+delimiters+ // very first number e.g "56,32,78"
							'|'+delimiters+val+'$'+ // very last number e.g ",56"
							'|^'+val+'$'+ // it is the only number in the list e.g "56"
							'/gi');
			
			while(ListFindNoCase(valueList, val))
			{
				valueList = valueList.replace(regExp,',');      
			}         
			
			first = valueList.substring(0,delimiters.length);
			if(first == delimiters)
				valueList = valueList.substring(delimiters.length,valueList.length);   
			
			last = valueList.substring((valueList.length - delimiters.length),valueList.length);
			if(last == delimiters)
				valueList = valueList.substring(0,valueList.length - delimiters.length);   
					
			return valueList;    
		},	
		*/
		
		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);	
		},
	   
		// returns true if the string only contains characters 0-9
		IsNumeric : function ()
		{
		  var regExp = /[\D]/g;
		  var str = arguments.length == 0 ? String.fromCharCode(event.keyCode) : arguments[0];
		  if (regExp.test(str)) return false;
		  return true;
		},
		
		// 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
				}
			}
		}
        
	},
		
	/****************************************** 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 = DimMe.Resize;
			// add the div
			document.write('<div id="'+this.dimmer+'" class="'+this.dimmer+'" style="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(DimMe.dimmer).style.height = documentHeight + "px";	
		},
		
		ShowDimmer: function(){
			this.Resize();
			document.getElementById(DimMe.dimmer).style.visibility = "visible";			
		},
		
		HideDimmer: function(){
			document.getElementById(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();


