var gInputLingua = new Class({
	load : function(){
		this.applyEvents( $$('input'));
		this.applyEvents( $$('textarea'));
		this.applyEvents( $$('select'));
	},
	
	applyEvents : function(arr){
		// FOR ANY ELEMENT THAT HAS THE RESPECTIVE ATTRIBUTE - ADD THIS EVENT LISTENER
		arr.each( function( el ){
			// TEXT SWITCHING
			if(	(el.tagName =='INPUT' && el.type == 'text' && el.getAttribute("textSwitch")) ||
				(el.tagName =='TEXTAREA' && el.getAttribute("textSwitch")) ){  
				this.textSwitchI(el);
			}
			
			// LIVE PREVIEW
			if(el.getAttribute("livePreview")){
				this.livePreviewI(el);
			}
			
			// ENTER CAPTURE
			if(el.tagName == 'INPUT' && el.type == 'text' && (button = el.getAttribute("enterCapture"))){  
				el.enterCaptureButton = button;
				el.keyPress = this.funcRes.enterCheck;
				el.addEvent("keydown", this.funcRes.enterCheck);
			}
			
			// CALL THE FOCUS HERE
			if(el.getAttribute('firstFocus')){
				el.focus();
			}
			
			// CALL THE FOCUS HERE
			if(el.getAttribute('maintainPrefix')){
				this.maintainPrefixI(el);
			}
			
			// BULLET A TEXTAREA
			if(el.getAttribute('bulletTextarea')){
				this.bulletTextareaI(el);
			}
		}, this );
	},
	
	textSwitchI : function(el){
		el.clearDefaultText = this.funcRes.clearDefaultText;
		el.restoreDefaultText = this.funcRes.restoreDefaultText;
						 
		el.addEvent('focus', el.clearDefaultText);
		el.addEvent('blur', el.restoreDefaultText);
			
		// WHAT IT STARTS WITH IS WHAT IT ENDS WITH
		if (el.value !== ''){
			el.defaultText = el.value;
		}
	},
	
	livePreviewI : function(el){
		if((el.tagName == 'INPUT' && el.type == 'text') || el.tagName=='TEXTAREA'){  
			err.log(5, 'livePreview - !');
			
			match = $(el.getAttribute("livePreview"));
			match.original_text = match.innerHTML;
			
			if(!el.lp_change){
				el.lp_change = this.funcRes.updateLiveMatch;
			}
			
			el.lp_change();
								 
			el.addEvent('keyup', el.lp_change);
			el.addEvent('blur', el.lp_change);
		}
		
		else if(el.tagName == 'SELECT'){
			err.log(5, 'livePreview - !select!');
			
			if(!el.lp_change){
				el.lp_change = this.funcRes.updateLiveMatch;
			}
			
			el.addEvent('change', el.lp_change);
			el.addEvent('blur', el.lp_change);
		}
	},
	
	maintainPrefixI : function(el){
		el.prefix = el.getAttribute('maintainPrefix');
		el.maintainPrefix = this.funcRes.maintainPrefix;
		
		el.addEvent('change', el.maintainPrefix);
	},
	
	bulletTextareaI : function(el){
		el.bulletTextarea = this.funcRes.bulletTextarea;
		
		el.addEvent('focus', el.bulletTextarea);
		el.addEvent('blur', el.bulletTextarea);
		el.addEvent('keyup', el.bulletTextarea);
	},
	
	////
	
	funcRes : {
		bulletTextarea : function(ev){
			var e = new Event( ev );
						
			// FOCUS -  PUT THE FIRST BULLET
			if(e.type == "focus" && e.target.value === ''){
				e.target.value = "* ";
			}	
				
			else if(e.type == "blur" && (e.target.value == "* " || e.target.value == "*")){
				e.target.value = '';
			}
			
			// KEY PRESS
			else if(e.code == 13){
		        e.target.value += "* ";
			}
		},
		
		enterCheck : function(ev){
			var e = new Event( ev );
			
			if(!e.target){
				return false;
			}
			
			if(e.code == 13){
				$(e.target.enterCaptureButton).click();
				return false;
			}

			return true;		
		},
		
		clearDefaultText : function(ev){			
			var e = new Event( ev );
			
			if (!e.target){
				return;
			}
			
			if (e.target.value == e.target.defaultText) {
				e.target.value = '';
				e.target.isEmpty = true;
			}
			else{
				e.target.isEmpty = false;
			}
		},
		
		restoreDefaultText : function(ev){
			var e = new Event( ev );
			
			if (!e.target){
				return;
			}
			
			if (e.target.value === '' && e.target.defaultText){
				e.target.value = e.target.defaultText;
				e.target.isEmpty = true;
			}
			else{
				e.target.isEmpty = false;
			}
		},
		
		updateLiveMatch : function(ev){			
			el = $(this.getAttribute("livePreview"));
			new_value = this.value;
			
			if(new_value === ''){
				el.innerHTML = el.original_text;
			}
			
			else {
				el.innerHTML = stripTags(new_value);
			}
		},

		maintainPrefix : function(ev){
			var e = new Event( ev );
			
			if (!e.target){
				return;
			}
			
			if(e.type == "keydown"){
				// BACKSPACE OR DELETE
				if(e.code == 8 || e.code == 46) { 		
					if(e.target.value.length <= e.target.prefix.length){
						return false;
					}
			    }
			}
			
			else{
				new_value = e.target.value;
				current_prefix = new_value.substring(0, e.target.prefix.length);
				
				if (current_prefix != e.target.prefix){
					e.target.value = e.target.prefix;
				}
			}
			
			return true;
		}
	}
});

function gFormPlus(){
	this.form_array = null;
	this.form_count = null;
	
	this.load = function(){
		this.form_array = [];
		this.form_count = 0;
		arr = document.getElementsByTagName('form');
		
		for (var i = 0; i < arr.length; i++){
			if(dependents = arr[i].getAttribute("formPlus")){
				this.form_array[this.form_count] = new FormInstance(arr[i], dependents);
			}
		}
	};
	
	this.lock = function(el){
		el.bLocked = true;
		el.className = el.origClass + " incomplete";
		this.lockDependents(el.formInstance);
	};
	
	this.unlock = function(el){
		if(el.bLocked){
			el.className = el.origClass;
			this.checkForm(el.formInstance);
			el.bLocked = false;
		}
	};
		
	this.checkForm = function(form){
		for(var i = 0; i < form.req_array.length; i++){
			req_el = form.req_array[i];
			if(!req_el.checkReq()){
				req_el.bLocked = true;
				this.lockDependents(form);
				return false;
			}
		}
		this.unlockDependents(form);
		return true;
	};
	
	this.lockDependents = function(form){
		for(var i = 0; i < form.dependents_array.length; i++){
			$(form.dependents_array[i]).disabled = true;
		}
	};
	
	this.unlockDependents = function(form){
		for(var i = 0; i < form.dependents_array.length; i++){
			$(form.dependents_array[i]).disabled = false;
		}
	};
	
	function FormInstance(form, dependents){		
		this.dependents_array = null;
		this.dependents_count = null;
		this.req_array = null;
		this.req_count = null;
				
		this.init = function(){
			// SUBMIT DEPENDENCIES
			if(dependents){
				click_fn = function(ev){
					var e = new Event( ev );
				
					if(!gForm.checkForm(this.formInstance)){
						e.stop();
						return false;
					}
				}
			
				this.dependents_array = dependents.split('|');
				this.dependents_count = this.dependents_array.length;
				
				for(var i = 0; i < this.dependents_count; i++){
					var dep = $(this.dependents_array[i]);
					dep.formInstance = this;
					dep.addEvent("click", click_fn);
				}
			}
			else{
				this.dependents_count = 0;
				this.dependents_array = [];
			}
			
			this.req_array = [];
			this.req_count = 0;
			
			// LOAD
			for (j=0; j < form.elements.length; j++){
				el = form.elements[j];
				reqType = el.getAttribute("req");
				
				if(reqType){
					this.req_array[this.req_count] = el;
					this.req_count++;
					
					el.formInstance = this;
					el.checkReq = this.getQualifier(reqType);
					el.origClass = el.getAttribute("class");
					
					evt_fn = function(ev){
						if(!this.checkReq()){
							gForm.lock(this); 
						}
						
						else{ 
							gForm.unlock(this); 
						}
					};
					
					key_fn = function(ev){
						var e = new Event( ev );
						
						// CATCH TAB KEY
						if(e.code == 9){	
							return;
						}
						
						if(!this.checkReq()){ 
							gForm.lock(this); 
						}
						
						else{ 
							gForm.unlock(this); 
						}
					};
					
					el.addEvent("keyup", key_fn);
					el.addEvent("blur", evt_fn);
					el.addEvent("change", evt_fn);
				}
			}
		};
	
		// RETRIEVE QUALIFYING FUNCTION
		this.getQualifier = function(type){
			// FUNCTIONS
			notEmpty 		= function(){ return (this.value.length != 0); }
			notPrefix 		= function(){ return (this.value != this.prefix && this.value.length != 0); }
			isNumeric 		= function(){ return (this.value == parseInt(this.value, 10));}
			isFloat 		= function(){ return (this.value == parseFloat(this.value, 10));}
			checkboxChecked = function(){ return this.checked};
			
			if(type == "!empty"){ return notEmpty; }
			if(type == "!prefix"){ return notPrefix; }
			if(type == "int"){ return isNumeric; }
			if(type == "float"){ return isFloat; }
			if(type == "checked"){ return checkboxChecked; }
		};		
		
		// FINISH 
		this.init();
	}
}	

// UNIVERSAL OBJECTS BASED ON CLASSES ABOVE
var gInput = new gInputLingua();
var gForm = new gFormPlus();

window.addEvent("domready", function(){gInput.load();});
window.addEvent("domready", function(){gForm.load();});

Date.prototype.parse = function(format, value){

    if(format == 'mmddyyyy' && value.length == 8){
        var nMonth = parseInt(value.substr(0,2), 10) - 1;
        var nDate = parseInt(value.substr(2, 2), 10);
        var nYear = parseInt(value.substr(4,4), 10);
        
        this.setMonth(nMonth);
        this.setDate(nDate);
        this.setFullYear(nYear);
    }
    
    if(format == 'mm/dd/yyyy hh:mm:ss' && value.length == 19){
        var dateArray = value.split(' ');
        if(dateArray.length == 2){
            var nMonth = parseInt(dateArray[0].substr(0,2), 10) - 1;
	        var nDate = parseInt(dateArray[0].substr(3, 2), 10);
            var nYear = parseInt(dateArray[0].substr(6,4), 10);
        
            var nHour= parseInt(dateArray[1].substr(0,2), 10);
	        var nMin = parseInt(dateArray[1].substr(3, 2), 10);
            var nSec = parseInt(dateArray[1].substr(6,2), 10);
        
            this.setMonth(nMonth);
            this.setDate(nDate);
            this.setFullYear(nYear);
            this.setHours(nHour);
            this.setMinutes(nMin);
            this.setSeconds(nSec);
        }
    }
};

////	FORMATTING

// PHONES
var digits = "0123456789";
var phoneNumberDelimiters = "+()- ";
var minDigitsInIPhoneNumber = 10;

function trimSpaces(str){ 
	if ($chk(str)){
		var i; 

		for (i=0; i < str.length; i++){
				if (str.charAt(i)!=" "){
						str=str.substring(i,str.length); 
						break;
				} 
		} 

		for (i = str.length-1; i >= 0; i--){
				if (str.charAt(i)!=" "){
						str = str.substring(0,i+1); 
						break;
				} 
		} 

		if (str.charAt(0)==" "){
				return; 
		}               
		else{
				return str; 
		}
	}
} 

function stripTags(str){
	if(!str){
		return str;
	}
	
	return str.replace(/<\/?[^>]+>/gi, '');
}

function cleanData(str){
	return trimSpaces(stripTags(str));
}

function stripslashes(str){
	str=str.replace(/\\'/g,'\'');
	str=str.replace(/\\"/g,'"');
	str=str.replace(/\\\\/g,'\\');
	str=str.replace(/\\0/g,'\0');
	return str;
}

function addslashes(str) {
	if(!str){
		return str;
	}
	
	str=str.replace(/\"/g,'\\"');
	str=str.replace(/\\/g,'\\\\');
	str=str.replace(/\0/g,'\\0');
	str=str.replace(/\'/g, '\\\'');
	return str;
}

function isInteger(str){
    for (var i = 0; i < str.length; i++){   
        var c = str.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
	
    return true;
}

function stripGivenChars(str, bad){
    var returnString = "";
    
    for (var i = 0; i < str.length; i++){   
        var c = str.charAt(i);
        if (bad.indexOf(c) == -1) returnString += c;
    }
	
    return returnString;
}

function isValidPhone(str){
	str = stripGivenChars(str, phoneNumberDelimiters);
	return (isInteger(str) && str.length >= minDigitsInIPhoneNumber);
}

function fillInput(input_id, el, el_val){
	var inp = $(input_id)
	inp.value = el_val;
	inp.focus();
}

function quoteText(id){
	var forumQuote = document.getElementById(id);
	if(document.selection){
		var str = document.selection.createRange().text;
		if(str !== ''){
			document.selection.createRange().text = '[quote]' + str + '[/quote]';
		} else {
			forumQuote.value += '[quote][/quote]';
		}
		return;
	} 
	else if(forumQuote.selectionEnd){
		var startPosition = forumQuote.selectionStart;
		var endPosition = forumQuote.selectionEnd;
		if(startPosition !== endPosition){
			var str = forumQuote.value.substring(startPosition, endPosition);
			forumQuote.value = forumQuote.value.substring(0, startPosition) + '[quote]' + str + '[/quote]' + forumQuote.value.substring(endPosition, forumQuote.value.length);
		} else {
			forumQuote.value += '[quote][/quote]'; 
		}
		return;
	}
	else {
		forumQuote.value += '[quote][/quote]'; 
		return;
	}
}

function quickQuote(id, text){
	var forumQuote = document.getElementById(id);
	forumQuote.value += text; 
	forumQuote.focus();
}

function styleText(type, id){
	if((type !== 'b')&&(type !== 'i')&&(type !== 'u')){
		return;
	}
	//selected text by textarea id
	var selectedText = document.getElementById(id);
	if(document.selection){
		var str = document.selection.createRange().text;
		if(str !== ''){
			document.selection.createRange().text = '['+type+']' + str + '[/'+type+']';
		} 
		else {
			fadeWarning('fadeWarning'+id);
		}
		return;
	} 
	else if(selectedText.selectionEnd){
		var startPosition = selectedText.selectionStart;
		var endPosition = selectedText.selectionEnd;
		if(startPosition !== endPosition){
			var str = selectedText.value.substring(startPosition, endPosition);
			selectedText.value = selectedText.value.substring(0, startPosition) + '['+type+']' + str + '[/'+type+']' + selectedText.value.substring(endPosition, selectedText.value.length);
		} else {
			fadeWarning('fadeWarning'+id);
		}
		return;
	}
	else {
		fadeWarning('fadeWarning'+id);
		return;
	}
}

function fadeWarning(id){
	var fade = document.getElementById(id);
	jQuery(fade).removeAttr('style');
	fade.innerHTML = 'Please select some text';
	setTimeout(function (){jQuery(fade).fadeOut(500)}, 1000);
}

function hexDec(){
	return document.getElementById('hexDec').value;
}

function siteLink(){
	return document.getElementById('siteLink').value;
}

function getBoxValue(id){
	return document.getElementById(id).value;
}

function jQBox(jid, id, type){
	if((type !== 'color')&&(type !== 'highlight')&&(type !== 'link')&&(type !== 'site')){
		return;
	}
	var selectedText = document.getElementById(id);
	
	if(document.selection){
		var str = document.selection.createRange().text;
		var easyMode = true;
		if(str !== ''){
			if(easyMode){
				var addOn;
				var notice;
				if(type == 'color'){
					addOn = '';
					notice = 'Enter a hexidecimal color without the"#"\n e.g. [color=0000FF]some text[/color]';
				}
				else if(type == 'highlight'){
					addOn = '';
					notice = 'Enter a hexidecimal color without the"#"\n e.g. [highlight=0000FF]some text[/highlight]';
				}
				else if(type == 'link'){
					addOn = '';
					notice = 'Enter a link from CarPedia, Tutorials, Forum or Fastlane on RideFix.\n';
					notice += 'Use the number associated with the item\n';
					notice += 'e.g. [link=15]some text[/link]';
					
				}
				else if(type == 'site'){
					addOn = 'http://';
					notice = 'Enter a link from a website.\n';
					notice += 'Be sure to include the "http://"\n';
					notice += 'e.g. [site=http://www.example.com]some text[/site]';
				}
				alert(notice);
				document.selection.createRange().text = '['+type+'='+addOn+']' + str + '[/'+type+']';
			} else {
				//jQuery(jid).dialog('open');
			}
		} 
		else {
			fadeWarning('fadeWarning'+id);
		}
		return false;
	} 
	else if(selectedText.selectionEnd){
		var startPosition = selectedText.selectionStart;
		var endPosition = selectedText.selectionEnd;
		if(startPosition !== endPosition){
			jQuery(jid).dialog('open');
			return false;
		} else {
			fadeWarning('fadeWarning'+id);
		}
		return;
	}
	else {
		fadeWarning('fadeWarning'+id);
		return;
	}
}

function boxText(jid,id,value,type){
	if((type !== 'color')&&(type !== 'highlight')&&(type !== 'link')&&(type !== 'site')){
		return;
	}
	//selected text by textarea id
	jQuery(jid).dialog('close');
	var selectedText = document.getElementById(id);
	if(document.selection){
		var str = document.selection.createRange().text;
		if(str !== ''){
			document.selection.createRange().text = '['+type+'='+value+']' + str + '[/'+type+']';
		} 
		else {
			fadeWarning('fadeWarning'+id);
		}
		return;
	} 
	else if(selectedText.selectionEnd){
		var startPosition = selectedText.selectionStart;
		var endPosition = selectedText.selectionEnd;
		if(startPosition !== endPosition){
			var str = selectedText.value.substring(startPosition, endPosition);
			selectedText.value = selectedText.value.substring(0, startPosition) + '['+type+'='+value+']' + str + '[/'+type+']' + selectedText.value.substring(endPosition, selectedText.value.length);
		} else {
			fadeWarning('fadeWarning'+id);
		}
		return;
	}
	else {
		fadeWarning('fadeWarning'+id);
		return;
	}
}

function jQBox2(jid, id, type){
	if((type !== 'video')&&(type !== 'image')){
		return;
	}
	jQuery(jid).dialog('open');
	
}

function boxTextOneLine(jid,id,value,type){
	if((type !== 'video')&&(type !== 'image')){
		return;
	}
	jQuery(jid).dialog('close');
	var boxText = document.getElementById(id);
	boxText.value += '['+type+'='+value+']';
	return;
}


