/**
 * Kaaterskil Library
 *
 * @category	Kaaterskil
 * @package		Kaaterskil
 * @copyright 	Copyright (c) 2008-2010 Kaaterskil Management, LLC
 * @version 	$Id: km_prototype.js,v 1.2 2010/06/21 13:34:41 Blair Exp $
 */

var BrowserSniffer = {
	isIE		: navigator.userAgent.toLowerCase().indexOf('msie') != -1,
	isMac		: navigator.userAgent.toLowerCase().indexOf('mac') != -1,
	isSafari	: navigator.userAgent.toLowerCase().indexOf('safari') != -1,
	isIntel		: navigator.userAgent.toLowerCase().indexOf('intel') != -1,
	
	isPowerPC	: navigator.userAgent.toLowerCase().indexOf('ppc') != -1,
	isKhtml		: navigator.userAgent.toLowerCase().indexOf('khtml') != -1,
	isWindows	: navigator.userAgent.toLowerCase().indexOf('win') != -1,
	isFirefox	: navigator.userAgent.toLowerCase().indexOf('firefox') != -1,
	
	minorVer	: navigator.appVersion.toLowerCase().indexOf('msie') >= 0
	  ? parseFloat(navigator.appVersion.substring(
			  navigator.appVersion.toLowerCase().indexOf('msie') + 5, 
			  navigator.appVersion.indexOf(
					  ';', navigator.appVersion.toLowerCase().indexOf('msie')))
		)
	  : parseFloat(navigator.appVersion),
				  
	majorVer	: navigator.appVersion.toLowerCase().indexOf('msie') >= 0
	  ? parseInt(navigator.appVersion.substring(
			  navigator.appVersion.toLowerCase().indexOf('msie') + 5, 
			  navigator.appVersion.indexOf(
					  ';', navigator.appVersion.toLowerCase().indexOf('msie')))
		)
	  : parseInt(navigator.appVersion)
};

Object.extend(HTMLFormElement.prototype, {
	validate : function(){
		var empty	= '', notSet	= '';
		
		for(var i = 0; i < this.elements.length; i++){
			var e = this.elements[i];
			
			if(e.type == 'text' || e.type == 'textarea'){
				if(e.required && (e.value == '' || e.value == null)){
					empty += '\n- ' + e.getFieldName();
				}
			}else if(e.type == 'select-one' || e.type == 'select-multiple'){
				if(e.required && e.selectedIndex <= 0){
					notSet += '\n- ' + e.getFieldName();
				}
			}
		}
		
		if(empty !== '' || notSet !== ''){
			var msg = 'Holdup! The form has errors:';
			if(empty !== ''){
				msg += '\n\nThe following required fields are empty: ' + empty;
			}
			if(notSet !== ''){
				msg += '\n\nThe following selections have not been made: ';
				msg += notSet;
			}
			alert(msg);
			return false;
		}	
		return true;
	}
});

Object.extend(HTMLInputElement.prototype, {
	getFebruaryDays : function(year){
		var result = 28;
		if(year % 100 == 0){
			if(year % 400 == 0){
				result = 29;
			}
		}else if(year % 4 == 0){
			result = 29;
		}		
		return result;
	},
	
	getFieldName : function(){
		var str = this.name;
		str	= str.replace(/_id/, '');
		str	= str.replace(/_/g, ' ');

		var result	= '';
		var words	= str.split(' ');
		for(var i = 0; i < words.length; i++){
			result += ' ' + words[i].charAt(0).toUpperCase() 
					  + words[i].substring(1);
		}		
		return result.substring(1);
	},
	
	getMessage : function(type){
		var arr = new Array();
		arr[0]	= ['text',		'Please use only letters, dashes, periods, commas or whitespace.'];
		arr[1]	= ['int',		'Please enter a valid integer.'];
		arr[2]	= ['float',		'Please enter a valid decimal number.'];
		arr[3]	= ['keyword',	'Please enter a query using standard characters.'];
		arr[4]	= ['state',		'Please enter a two-character state abbreviation.'];
		arr[5]	= ['ZIP_Code',	'Please enter a valid ZIP Code in XXXXX-XXXX format.'];
		arr[6]	= ['telephone', 'Please enter a valid telephone number in XXX-XXX-XXXX format.'];
		arr[7]	= ['email',		'Please enter a valid email address.'];
		arr[8]	= ['year',		'Please enter a 4-digit year between 1900 and 2100.'];
		arr[9]	= ['ip',		'Please enter a valid IP address.'];
		arr[10]	= ['url',		'Please enter a valid URL.'];
		
		if(type.match(/[Tt]ext/)){
			type = 'text';
		}
		if(type.match(/int/)){
			type = 'int';
		}
		
		var result = 'Hold up!';
		for(var i = 0; i < arr.length; i++){
			if(arr[i][0] == type){
				result = arr[i][1];
				break;
			}
		}
		return result;
	},
	
	getRegex : function(type){
		var ptnHtml			= /^[a-zA-Z0-9_#\-\+\='"\.\!\:\s,<>\/\(\)]+$/;
		var ptnText			= /^[a-zA-Z0-9_#\-\+'"\.\!\:\s,\/\?\(\)]+$/;
		var ptnInt			= /^[\d\-]+$/;
		var ptnFloat		= /^[0-9\-]+(\.[0-9]*)?$/;
		var ptnDollar		= /^[0-9\-]+(\.[0-9]{0,2})?$/;
		var ptnKeyword		= /[a-zA-Z0-9_\-'\s]+/;
		var ptnState		= /^[a-zA-Z]{2}$/;
		var ptnZIPCode		= /^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$/;
		var ptnTelephone	= /^\(?([2-9][0-9][0-9])\)?(?:[\-\.\s])?([2-9][0-9][0-9])(?:[\-\.\s])?([0-9]{4})$/;
		var ptnEmail		= /([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,6})/;
		var ptnYear			= /^([1][9][0-9][0-9]|[2][0][0-9][0-9])$/;
		var ptnIP			= /^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/;
		var ptnUrl			= /^((http|https)\:\/\/)?(([a-zA-Z0-9_\-]{2,}\.)+[a-zA-Z]{2,})(\:[a-zA-Z0-9]+)?([a-zA-Z0-9_\-\.\?\+\/\\&;%\$#\=~]*)?$/;
		
		var arr = new Array();
		arr[0]	= ['html_text', ptnHtml];
		arr[1]	= ['text', ptnText];
		arr[2]	= ['int', ptnInt];
		arr[3]	= ['float', ptnFloat];
		arr[4]	= ['dollar', ptnDollar];
		arr[5]	= ['keyword', ptnKeyword];
		arr[6]	= ['state', ptnState];
		arr[7]	= ['ZIP_Code', ptnZIPCode];
		arr[8]	= ['telephone', ptnTelephone];
		arr[9]	= ['email', ptnEmail];
		arr[10]	= ['year', ptnYear];
		arr[11]	= ['ip', ptnIP];
		arr[12]	= ['url', ptnUrl];
		
		var result = '';
		for(var i = 0; i < arr.length; i++){
			if(arr[i][0] == type){
				result = arr[i][1];
				break;
			}
		}
		return result;
	},

	formatDollar : function(){
		var result	= '0.00';
		var val		= this.value;
		
		if(!val.match(/[^0-9-\.]/)){
			var arr = val.spli('.');
			if(arr.length == 1){
				result = arr[0] + '.00';
			}else{
				if(arr.length > 2){
					arr[1] = arr[1].substr(0, 2) + arr[1].substr(2);
					arr[1] = Math.round(arr[1]);
				}else if(arr[1].length == 1){
					arr[1] = arr[1] + '0';
				}
				result = arr[0] + '.' + arr[1];
			}
		}
		this.value = result;
	},
	
	formatTelephone : function (){
		var result;
		var ptn = /^\(?([2-9]\d{2})\)?(?:\-?|\s?)([2-9]\d{2})(?:\-?|\s?)(\d{4})$/;
		
		if(parts = this.value.match(ptn)){
			if(parts.length > 3){
				result = parts[1] + '-' + parts[2] + '-' + parts[3];
			}else{
				result = parts[1] + '-' + parts[2];
			}
		}
		this.value = result;
	},
	
	formatZipCode : function (){
		var val = this.value;
		var len = val.length;
		
		if(len > 5 && val.match('-') == null){
			val = val.substr(0, 5) + '-' + val.substr(5);
		}
		this.value = val;
	},
	
	setAlert : function(msg){
		this.value = '';
		alert(msg);
		return false;
	},
	
	ucfirst : function(){
		this.value = this.value.charAt(0).toUpperCase() 
					 + this.value.substring(1).toLowerCase();
	},
	
	uppercase : function (){
		if(this){
			this.value = this.value.toUpperCase();
		}
	},
	
	validateDate : function(){
		var val 	= this.value;
		var min 	= 1900;
		var max 	= 2100;
		var msg		= 'Please enter a valid date in mm/dd/YYYY format.';
		var months	= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		var parser	= ['-', ' ', '/', '.'];
		var type	= -1;
		
		//get date parser
		for(var i = 0; i < parser.length; i++){
			if(val.indexOf(parser[i]) > 0){
				type = i;
				break;
			}
		}
		
		//split date components
		if(type !== -1){
			var parts = val.split(parser[type]);
			if(parts.length != 3){
				return this.setAlert(msg);
			}
		}else{
			return this.setAlert(msg);
		}
		
		//test year
		var year;
		if(parts[2].length == 2){
			year = (parseInt(parts[2]) + 2000);
		}else{
			year = parseInt(parts[2]);
		}
		if(year < min || year > max){
			return this.setAlert(msg);
		}
		
		//test month
		var month = parseInt(parts[0]);
		if(month < 1 || month > 12){
			return this.setAlert(msg);
		}
		
		//test day
		var day		= parseInt(parts[1]);
		var febDays	= this.getFebruaryDays(year);
		if((day < 1) || (day > months[month - 1]) 
				|| (month == 2 && day > febDays)){
			return this.setAlert(msg);
		}
		
		//build date
		var result = month + '/' + day + '/' + year;
		this.value = result;
		return result;
	},
	
	validateString : function(type){
		if(type === null || type == ''){
			return;
		}		
		if(this.value == null || this.value == ''){
			return;
		}
		
		var ptn	= this.getRegex(type);
		if(!this.value.match(ptn)){
			return this.setAlert(this.getMessage(type));
		}
		return true;
	}
});

Element.addMethods({
	getCoords : function(element){
		element = $(element);
		var valueX = 0, valueY = 0;
		do{
			valueX += element.offsetLeft || 0;
			valueY += element.offsetTop || 0;
			element = element.offsetParent;
		}while(element);
		
		return {left : valueX, top : valueY};
	},
	
	setCoords : function(element, left, top){
		element = $(element);
		var coords = {left : 0, top : 0};
		if(element.offsetParent){
			coords = Element.getCoords(element.offsetParent);
		}
		
		Element.setStyle(element, {
			left : (left - coords.left) + 'px',
			top : (top - coords.top) + 'px'
		});
		
		return element;
	},
	
	swapImg : function(element){
		var e = $(element).down('img');
		
		var parts	= e.src.match(/(.+)\.(gif|jpg|jpeg|png|bmp)/);
		var result	= parts[1].match(/_on$/);
		if(result){
			e.src = parts[1].substr(0, parts[1].length - 3) + '.' + parts[2];
		}else{
			e.src = parts[1] + '_on.' + parts[2];
		}
		return; element;
	},
	
	swapBtn : function(name, src){
		var items = document.getElementsByTagName('input');
		for(var i = 0; i < items.length; i++){
			if(name == items[i].name){
				items[i].src = src;
				break;
			}
		}
	}
});

function redirect(url){
	if(url != '' && url != 0){
		window.location.href = url;
	}
}

function redirect_option(url, obj){
	var label	= obj.options[obj.selectedIndex].label;
	var value	= obj.options[obj.selectedIndex].value;
	var href	= url + label + value;
	window.location.href = href;
}

function confirm_delete(v){
	var msg = 'Are you sure you want to delete this ' + v + '?';
	if(confirm(msg)){
		return true;
	}
	return false;
}

function swapImg(element){
	if(!$(element).swapImg){
		return;
	}
	return $(element).swapImg();
}
