/* Javascript File toolkit.js */
if (!this.Toolkit){
	
	var Toolkit = function(){
		
		return {
			
			Fades : new Array(),
			Animations : new Array(),
			
			get : function (element){ 
				if (typeof element != 'string'){ 
					return element; 
				}
				
				return document.getElementById(element);

			},
			
			getElements : function (tag, att, element){
				
				if (!element){ var element = document; }

				var elem = Toolkit.get(element).getElementsByTagName(tag);

				if (att != ''){
					
					var arr = new Array();
					
					if (typeof att == 'object'){

						var attArray = new Array();
						var i = 0;
						for (key in att){
							attArray[i] = key+':'+att[key];
							i++;
						}
						
					}
					else {
						var attArray = att.split(',');				
					}					
					
					if (attArray.length > 0){
						var attKeys = new Array();
						var attValues = new Array();
						for (var i = 0; i < attArray.length; i++){
							attKeys[i]   = Toolkit.trim(attArray[i].substr(0, attArray[i].indexOf(':')));
							attValues[i] = Toolkit.trim(attArray[i].substr((attArray[i].indexOf(':')+1)));
						}
						
						for(var i = 0; i < elem.length; i++){
						
							var obj = Toolkit.getAttributes(elem[i], attKeys.join(','), true);
							var match = true;
							
							for (var j = 0; j < attKeys.length; j++){
								if (attValues[j] != obj[attKeys[j]]){
									match = false;
									break;
								}
							}
							if (!match){ continue; }
							arr[arr.length] = elem[i];
						
						}
						
					}
					
					return arr;
				}
				return elem;
				
			},
			
			kill : function(element){
				element = Toolkit.get(element);
				if(element){ 
					element.parentNode.removeChild(element); 
				}
			},
			
			replaceElement : function(element, replacement){
				
				if (typeof replacement != 'object'){
					var div = Toolkit.build('div');
					div.innerHTML = replacement;
					replacement = Toolkit.getFirstChild(div);
				}

				Toolkit.get(element).parentNode.replaceChild(replacement, Toolkit.get(element));
				
			},
			
			getAttributes : function (el, attributes, obj){
				
				el = Toolkit.get(el);
				var forceObject = false;
				if (obj){ forceObject = true; }
				
				var object = new Object();
				
				var parts = attributes.split(',');
				
				for (var i = 0; i < parts.length; i++){
					var att = parts[i];
					if (browser.isIE){

						switch (att){
							case "class":
								var val = el.className;
							break;
							case "id":
							case "href":
							case "name":
							case "src":
							case "alt":
							case "rel":
							case "target":
								var val = el.getAttribute(att);
							break;
							case "onmousedown":
							case "onclick":
							case "onmouseup":
							case "onmousemove":
							case "onmouseover":
							case "onmouseout":
								// var line = 'el.attachEvent(\''+att+'\', function(){ '+val+' })';
								// eval(line);
							break;
							case "opacity":
								var val = parseInt(el.style.filter.replace('alpha(opacity =',''))/100;	
								if (isNaN(val)){ val = 0; }					
							break;
							case "display":
							case "top":
							case "left":
							case "width":
							case "height":
							case "margin":
								var line = 'var val = el.style.'+att;
								eval(line);
							break;
							default:
								Shout.alertOnce(att+' not yet supported? tell greg: getAttributes + '+att);
							break;
						}
					}
					else {
						switch (att){
							case "display":
							case "opacity":
							case "top":
							case "left":
							case "width":
							case "height":
							case "margin":
							//	var val = el.style.opacity;
								var line = 'var val = el.style.'+att;
								eval(line);
							break;
							default:
								var val = el.getAttribute(att);
							break;
						}
					}
					object[att] = val;
				}
				
				if (parts.length == 1 && !forceObject){ return val; }
				return object;
			},
			
			setAttributes : function (element, attributes){
				
				element = Toolkit.get(element);
				
				if (typeof attributes == 'object'){

					var parts = new Array();
					var i = 0;
					for (key in attributes){
						parts[i] = key+':'+attributes[key];
						i++;
					}
					
				}
				else {
					var parts = attributes.split(',');				
				}
				
				
				for (var i = 0; i < parts.length; i++){
				
					var theseparts = parts[i].split(':');
					var att = Toolkit.trim(theseparts[0]);
					theseparts = theseparts.slice(1);
					var val = Toolkit.trim(theseparts.join(':'));
					
					if (browser.isIE){
						switch (att){
							case "class":
								if (browser.version = '8'){
									element.setAttribute('class', val);
								}
								else {
									element.setAttribute('className', val);
								}
							break;
							case "id":
							case "href":
							case "name":
							case "src":
							case "alt":
							case "title":
							case "rel":
							case "target":
								element.setAttribute(att, val);
							break;
							case "onmousedown":
							case "onclick":
							case "onmouseup":
							case "onmousemove":
							case "onmouseover":
							case "onmouseout":
								var line = 'element.attachEvent(\''+att+'\', function(){ '+val+' })';
								eval(line);
							break;
							case "opacity":
								var line = 'element.style.filter = "alpha(opacity = '+(val*100)+')"';
								eval(line);
							break;
							case "innerHTML":
								element[att] = val;
							break;
							case "display":
							case "top":
							case "left":
							case "width":
							case "height":
							case "zIndex":
							case "margin":
								//var line = 'element.style.'+att+' = "'+Toolkit.trim(val)+'"';
								//eval(line);
								element.style[att] = val;
							break;
							default:
								alert(att+' not yet supported? tell greg: setAttributes + '+att);
							break;
						}
					}
					else {
						switch (att){
							case "opacity":
							case "display":
							case "top":
							case "left":
							case "width":
							case "height":
							case "zIndex":
							case "margin":
								//var line = 'element.style.'+att+' = "'+val+'"';
								//eval(line);
								element.style[att] = val;
							break;
							case "innerHTML":
								element.innerHTML = val;
								//element[att] = value;
								
							break;
							default:
								// setTimeout('Shout.AlertOnce(\''+att+'\')', 3000);
								element.setAttribute(att, val);
							break;
						}
					}
					
				}
				
			},
			
			getDimensions : function(element, specific) {
				
				element = Toolkit.get(element);
				
				var object = new Object();
							
				var curwidth = element.offsetWidth;
				var curheight = element.offsetHeight;	
				var curleft = curtop = 0;
				if (element.offsetParent) {
					curleft = element.offsetLeft;
					curtop = element.offsetTop;
					while (element = element.offsetParent) {
						curleft += element.offsetLeft;
						curtop += element.offsetTop;
					}
				}
				
				object['width'] = curwidth;
				object['height'] = curheight;
				object['left'] = curleft;
				object['top'] = curtop;
				object['boundaryRight'] = curleft+curwidth;
				object['boundaryBottom'] = curtop+curheight;
				
				switch (specific){
					
					case 'width':
					case 'height':
					case 'left':
					case 'top':
					case 'boundaryRight':
					case 'boundaryBottom':
						return object[specific];
					break;					
					default:
						return object;
					break;
				}
				
			},
			
			trim : function (value){
				
				if (value){
					value = value.replace(/^\s+/,'').replace(/\s+$/,'');
				}		
				return value;	
			},
			
			validateInputPattern : function(element, pattern, maxLength, alertMessage, inputEvent){

				element = Toolkit.get(element);
				if (element.value.length > maxLength){
					if ( alertMessage )
					{
						alert( alertMessage );
					}
					element.value = element.value.substring(0, maxLength);
				}

				var fieldValue = element.value;

				var regex = new RegExp( pattern );
				if (!fieldValue.match( regex )){
					if ( alertMessage ) {
						alert( alertMessage );
					}
					element.value = element.value.substring( 0, element.value.length - 1 );
					return false;
				}
				return true;
			},
			
			restrictInputPattern : function(element, pattern, maxLength, lengthAlert, inputEvent){
				
				var keycode = Toolkit.getKeycode(inputEvent);
				if(keycode == 13){ return false; }

				element = Toolkit.get(element);
				if (element.value.length > maxLength){
					if ( lengthAlert ) {
						alert( lengthAlert );
					}
					element.value = element.value.substring(0, maxLength);
				}

				var fieldValue = element.value.substring(element.value.length - 1, element.value.length);

				var regex = new RegExp( pattern );
				if (!fieldValue.match( regex )){
					element.value = element.value.substring( 0, element.value.length - 1 );
					return false;
				}
				return true;
				
			},
			
			getKeycode : function (e){
				
				if (!window.event){ 
					return e.keyCode; 	
				}
				return event.keyCode; 
				
			},
			
			getViewport : function(){
				
				var obj = new Object;				
				obj.scrollTop = document.documentElement.scrollTop;
				obj.scrollHeight = document.documentElement.scrollHeight;
				if (browser.isIE){
					obj.width 	  = document.documentElement.clientWidth;
					obj.height 	  = document.documentElement.clientHeight;
				}
				else {
					obj.width 	  = window.innerWidth;
					obj.height 	  = window.innerHeight;
				}
				return obj;
				
			},
			
			getFirstChild : function(element){
			
				if (!element){ var element = document.body; }
				for (var i = 0; i < element.childNodes.length; i++){
					if (element.childNodes[i].nodeType == 1){
						return element.childNodes[i];
					}
				}
				
			},
			
			build : function(element, attributes){
				
				var el = document.createElement(element)
				if (attributes){
					Toolkit.setAttributes(el, attributes);
				}
				return el;
			},
			
			clearSelection : function(){
				
				if (document.selection){ 		document.selection.empty(); 			 } 
				else if (window.getSelection){  window.getSelection().removeAllRanges(); }
				
			},
			
			fadeIn : function(element, effectSpeed, fadeID, stopValue){
				element = Toolkit.get(element);
				if (!element){ 
					if (fadeID){
						clearInterval(this.Fades[fadeID]);
					}
					return; 
				}
				if (!stopValue){ stopValue = 1; }
				
				if (fadeID != undefined){
					var currentOpacity = parseFloat(Toolkit.getAttributes(element, 'opacity'));
					Toolkit.setAttributes(element, 'opacity:'+(currentOpacity+0.1));
					if (currentOpacity >= (stopValue - 0.1)){ 
						clearInterval(this.Fades[fadeID]); 
						Toolkit.setAttributes(element, 'opacity:'+stopValue);
					}
				}
				else if (!element && fadeID){ clearInterval(this.Fades[fadeID]); }
				else if (effectSpeed == 0){ Toolkit.setAttributes(element, 'opacity:1'); } 
				else {
					var fadeID = this.Fades.length;
					var fadeSpeed = effectSpeed / 10;
					var currentOpacity = parseFloat(Toolkit.getAttributes(element, 'opacity'));
					if (currentOpacity == '' || isNaN(currentOpacity) || currentOpacity == 1){ 
						Toolkit.setAttributes(element, 'opacity:0');
					}
					
					this.Fades[fadeID] = setInterval('Toolkit.fadeIn("'+Toolkit.getAttributes(element, 'id')+'", "", "'+fadeID+'", "'+stopValue+'")', fadeSpeed);
				}
			},
			
			fadeOut : function(element, effectSpeed, fadeID, stopValue){
				element = Toolkit.get(element);
				if (!element){ 
					if (fadeID){
						clearInterval(this.Fades[fadeID]);
					}
					return; 
				}
				if (!stopValue){ stopValue = 0; }
				
				if (fadeID != undefined && element){
					var currentOpacity = parseFloat(Toolkit.getAttributes(element, 'opacity'));
					if (currentOpacity === ''){ Toolkit.setAttributes(element, 'opacity:1'); }
					Toolkit.setAttributes(element, 'opacity:'+(currentOpacity-0.1));
					if (currentOpacity <= stopValue){ 
						clearInterval(this.Fades[fadeID]);
						Toolkit.setAttributes(element, 'opacity:'+stopValue);
					}
				}
				else if (!element && fadeID){ clearInterval(this.Fades[fadeID]); }
				else if (effectSpeed == 0){ Toolkit.setAttributes(element, 'opacity:0'); } 
				else {
					var fadeID = this.Fades.length;
					var fadeSpeed = effectSpeed / 10;
					var currentOpacity = parseFloat(Toolkit.getAttributes(element, 'opacity'));
					if (currentOpacity == '' || isNaN(currentOpacity) || currentOpacity == 0){ 
						Toolkit.setAttributes(element, 'opacity:1');
					}
					this.Fades[fadeID] = setInterval('Toolkit.fadeOut("'+Toolkit.getAttributes(element, 'id')+'", "", "'+fadeID+'", "'+stopValue+'")', fadeSpeed);
				}
			},
			
			hover : function(element, type, color, bgcolor){
								
				switch (type){
					case false:
						if (!color){ color = ''; }
						if (!bgcolor){ bgcolor = ''; }
					break;
					default:
						if (!color){ color = '#ffffff'; }
						if (!bgcolor){ bgcolor = '#0099ff'; }
					break;					
				}
				element.style.color = color;
				element.style.backgroundColor = bgcolor;
				
			},
			
			animate : function(element, effectSpeed, width, height, top, left, animationID){

				element = Toolkit.get(element);
				if (animationID){

					var confirmations = new Array();
					var parts = effectSpeed.split(',');
					for (var i = 0; i < parts.length; i++){
						
						var theseparts = parts[i].split(':');
						if (theseparts[1] == '' || theseparts[1] == 'false'){
							confirmations[confirmations.length] = true;
							continue;
						}
						
						var value = parseInt(theseparts[1]);
						switch (i){
							
							case 0:
								if (width == parseInt(element.style.width)){
									confirmations[confirmations.length] = true;
									continue;
								}
								var next = parseInt(element.style.width)+value;
								if ((value > 0 && width < next) || (value < 0 && width > next)){
									element.style.width = width+'px';
									confirmations[confirmations.length] = true;
									continue;
								}
								element.style.width = next+'px';
							break;
							case 1:
								if (height == parseInt(element.style.height)){
									confirmations[confirmations.length] = true;
									continue;
								}
								var next = parseInt(element.style.height)+value;
								if ((value > 0 && height < next) || (value < 0 && height > next)){
									element.style.height = height+'px';
									confirmations[confirmations.length] = true;
									continue;
								}
								element.style.height = next+'px';
							break;
							case 2:
								if (top == parseInt(element.style.top)){
									confirmations[confirmations.length] = true;
									continue;
								}
								var next = parseInt(element.style.top)+value;
								if ((value > 0 && top < next) || (value < 0 && top > next)){
									element.style.top = top+'px';
									confirmations[confirmations.length] = true;
									continue;
								}
								element.style.top = next+'px'
							break;
							case 3:
								if (left == parseInt(element.style.left)){
									confirmations[confirmations.length] = true;
									continue;
								}
								var next = parseInt(element.style.left)+value;
								if ((value > 0 && left < next) || (value < 0 && left > next)){
									element.style.left = left+'px';
									confirmations[confirmations.length] = true;
									continue;
								} 
								
								element.style.left = next+'px';
							break;
							
						}
						confirmations[confirmations.length] = false;
						
					}
					if (confirmations[0] && confirmations[1] && confirmations[2] && confirmations[3]){
						clearInterval(this.Animations[animationID]);
					}
					
				}
				else if (!element && animationID){ clearInterval(this.Animations[animationID]); }
				else if (effectSpeed == 0){
					Toolkit.setAttributes(element, 'width:'+width+',height:'+height+',top:'+top+',left:'+left);
				}
				else {
					
					var obj = element.style;
					
					var widthspeed = false;
					if (width && (parseInt(obj.width) > parseInt(width) || parseInt(obj.width) < parseInt(width))){
						widthspeed = (parseInt(width) - parseInt(obj.width)) / 20; 
					}
					
					var heightspeed = false;
					if (height && (parseInt(obj.height) > parseInt(height) || parseInt(obj.height) < parseInt(height))){
						heightspeed = (parseInt(height) - parseInt(obj.height)) / 20;
					}
					
					var topspeed = false;
					if (top && (parseInt(obj.top) > parseInt(top) || parseInt(obj.top) < parseInt(top))){
						topspeed = (parseInt(top) - parseInt(obj.top)) / 20;
					}
					
					var leftspeed = false;
					if (left && (parseInt(obj.left) > parseInt(left) || parseInt(obj.left) < parseInt(left))){
						leftspeed = (parseInt(left) - parseInt(obj.left)) / 20;
					}
					
					animationSpeed = effectSpeed / 20;
					effectSpeed = 'width:'+widthspeed+',height:'+heightspeed+',top:'+topspeed+',left:'+leftspeed;					
					var obj = Toolkit.getAttributes(element, 'id', true);
					var animationID = this.Animations.length;
					this.Animations[animationID] = setInterval('Toolkit.animate("'+obj['id']+'", "'+effectSpeed+'", "'+width+'","'+height+'","'+top+'","'+left+'", "'+animationID+'")', animationSpeed);
					
				}
				
			}
			
		};		
	}();	
}

