

	//[ 2011.1220
	jQuery.noConflict();

	jQuery(document).ready(function() {
		SimpleForms();
	});

	
	jQuery.fn.extend({
		
		//----------------------------------------------------------------------
		/**
		 * 
		 */
		//----------------------------------------------------------------------
		onValidate: function(ajax){
			
			if( jQuery(this).get(0).tagName != "FORM" )
				throw("doAjax only supports form tags.");
			
			var form_id = jQuery(this).attr('id');
			
			if( typeof ajax == 'function' )
				jQuery(this).data("do_ajax", ajax);
		},
		
		
		//----------------------------------------------------------------------
		/**
		 * 
		 */
		//----------------------------------------------------------------------
		toJSON: function(options){
			
			if( jQuery(this).get(0).tagName != "FORM" )
				throw("toJSON only supports form tags.");
			
			var form_id = jQuery(this).attr('id');
			var form = {};
	
		    
			if( jQuery('#' + form_id).length )
			{
				jQuery('#' + form_id).find(':input').each( function(i,e) {
					
					//---[ must not be disabled field  readonly ]---
					if( !jQuery(this).attr('disabled') )
					{
						//form[ jQuery(this).attr('name') ] = jQuery(this).val();
					
						//---[ TODO: handle checkboxes and radios :radio :checkbox :checked ]---
						var input_type = jQuery(this).attr('type');
						
						//---[ handle select and textarea ]---
						if( input_type == undefined )
							input_type = jQuery(e).get(0).tagName.toLowerCase();
						
						switch( input_type )
						{
							case 'radio':
								//---[ is selected ]---
								if( jQuery(this).is(':checked') )
									form[ jQuery(this).attr('name') ] = jQuery(this).val();
							break;
							
							case 'checkbox':
								//---[ is selected ]---
								if( jQuery(this).is(':checked') )
									form[ jQuery(this).attr('name') ] = jQuery(this).val();							
							break;
							
							//case 'select':
							//case 'textarea':
							//case 'text':
							default:
								form[ jQuery(this).attr('name') ] = jQuery(this).val();
							break;
						}
					}
					
				});
			}
	
			//---[ add default params to form ]---
			jQuery.extend(form, options || {});
			
			
			return form;
		}
	});		
	
	
	//----------------------------------------------------------------------
	/**
	 * usage: jQuery('#formid').onValidate(function(){ alert('success'); });
	 */
	//----------------------------------------------------------------------
	function SimpleForms()
	{
		/*/
		jQuery('[class~=datepicker]').datepicker({
			//altField: '#alternate',
			showOn: 'both',
			buttonImage: '/templates/images/cal-icon.png',
			buttonImageOnly: true,
			showButtonPanel: true,	
			changeMonth: true,
			changeYear: true
		}); 
	
		
		jQuery('[class~=dob]').datepicker({
			//altField: '#alternate',
			showOn: 'both',
			buttonImage: '/templates/images/cal-icon.png',
			buttonImageOnly: true,
			showButtonPanel: true,	
			changeMonth: true,
			changeYear: true,
			yearRange: "-100:+0"
		});		
		/**/
		
		jQuery('form[class^="validate"], form[rel^="validate"]').each(function(i,e){			
			
			jQuery(e).validate({
				errorPlacement: function(error, element) {
					//[ do nothing
				},
				success: function(element) {
					//[ do nothing
				},
				submitHandler: function(form) 
				{
					//---[ extract the form id ]---
					var form_id  = (typeof form == "object") ?  jQuery(form).attr('id')  : form.id;
					var b_submit = false;
					
					
					if( typeof jQuery('#' + form_id).data('do_ajax') == 'function' )
					{
						var json = jQuery('#' + form_id).toJSON();
						var results = jQuery('#' + form_id).data('do_ajax')(json);

						//---[ return the results ]---
						b_submit = (results != undefined && results != null) ? results : false;				
					}
					
					else if( typeof jQuery('#' + form_id).data.do_ajax == 'function' )
					{
						//[ DEPRECATED TODO: REMOVE
						
						var json = jQuery('#' + form_id).toJSON();
						var results = jQuery('#' + form_id).data.do_ajax(json);

						//---[ return the results ]---
						b_submit = (results != undefined && results != null) ? results : false;
					}
					
					else
					{
						b_submit = true;
					}
					
					if( b_submit ) 
						form.submit();
				},
				rules: {
				}
			});	
					
		});
		
		jQuery.validator.addMethod("alphanumeric", function(value, element) {
			return this.optional(element) || /^[a-z0-9\_]+$/i.test(value);
		}, "Username must contain only letters, numbers, or underscore.");

		jQuery.validator.addMethod("alpha", function(value, element) {
			return this.optional(element) || /^[a-zA-Z]+$/i.test(value);
		}, "Username must contain only letters, numbers, or underscore.");		
		
		jQuery.validator.addMethod("date", function(value, element) {
			var pass = this.optional(element) || /^(\d{2})(\/\d{2})(\/\d{4})$/.test(value);
			return pass;
		}, "Dates must be mm/dd/yyyy");		
		jQuery.validator.addMethod("datepicker", function(value, element) {
			var pass = this.optional(element) || /^(\d{2})(\/\d{2})(\/\d{4})$/.test(value);
			return pass;
		}, "Dates must be mm/dd/yyyy");		
		jQuery.validator.addMethod("dob", function(value, element) {
			var pass = this.optional(element) || /^(\d{2})(\/\d{2})(\/\d{4})$/.test(value);
			return pass;
		}, "Dates must be mm/dd/yyyy");		
	    jQuery.validator.addMethod("numeric", function(value, element) {
 	        return this.optional(element) || /^[0-9\-\+]+$/i.test(value);
 	    }, "Phone must contain only numbers, + and -.");

	    jQuery.validator.addMethod("username", function(value, element) {
	 	        return this.optional(element) || /^[a-z0-9\_]+$/i.test(value);
	 	}, "Username must contain only letters, numbers, or underscore.");	
	    
	    jQuery.validator.addMethod("dashed", function(value, element) {
 	        return this.optional(element) || /^[a-z0-9\-]+$/i.test(value);
	    }, "Username must contain only letters, numbers, or underscore.");		    
	    
	    jQuery.validator.addMethod("decimal", function(value, element) {
 	        return this.optional(element) || /^[-+]?[0-9]+(\.[0-9]+)?$/i.test(value);
 	    }, "Phone must contain only numbers, + and -.");			
	}
	
	
/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y<h;y++){if(g[y]){m[y]=d.placeholder;var z=v(y);if(z<h&&g[y].test(m[z])){m[y]=m[z]}else{break}}}s();r.caret(Math.max(i,x))}function u(y){for(var A=y,z=d.placeholder;A<h;A++){if(g[A]){var B=v(A);var x=m[A];m[A]=z;if(B<h&&g[B].test(x)){z=x}else{break}}}}function l(y){var x=a(this).caret();var z=y.keyCode;n=(z<16||(z>16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(x<h){var A=String.fromCharCode(C);if(g[x].test(A)){u(x);m[x]=A;s();var y=v(x);a(this).caret(y);if(d.completed&&y==h){d.completed.call(r)}}}}}return false}function w(x,y){for(var z=x;z<y&&z<h;z++){if(g[z]){m[z]=d.placeholder}}}function s(){return r.val(m.join("")).val()}function p(y){var z=r.val();var C=-1;for(var B=0,x=0;B<h;B++){if(g[B]){m[B]=d.placeholder;while(x++<z.length){var A=z.charAt(x-1);if(g[B].test(A)){m[B]=A;C=B;break}}if(x>z.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1<e){r.val("");w(0,h)}else{if(y||C+1>=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery);	
