/**
 *  Add $.preLoadImages() functionality to jQuery
 */
(function($) {
  var cache = [];
  // Arguments are image paths relative to the current page.
  $.preLoadImages = function() {
    var args_len = arguments.length;
    for (var i = args_len; i--;) {
      var cacheImage = document.createElement('img');
      cacheImage.src = arguments[i];
      cache.push(cacheImage);
    }
  }
})(jQuery);


/**
 * Add tree-view
 *
 */
(function($) {
	$.fn.extend( {
		treeView: function() {
			var descend = function( $node ) {
				$node.children( 'li' ).each( function() {
					var $branch = $(this);
					var $children = $branch.find('ul:first');
					if ( $children.size() > 0 ) {
						var node = {
							open:function() {
								$branch.removeClass( 'tree-branch-closed' ).addClass( 'tree-branch-open' );
								$children.slideDown( Math.min(200,$children.height()*2) );
							},
							close: function() {
								$branch.removeClass( 'tree-branch-open' ).addClass( 'tree-branch-closed' );
								$children.slideUp( Math.min(200,$children.height()*2) );
							}
						};
						$branch.addClass( 'tree-branch-closed' );
						$branch.children( 'a:first' ).bind( 'click', function(evt) {
								if ( $branch.hasClass('tree-branch-closed') ) {
									node.open();
									var openNode = $node.data( 'open' );
									if ( openNode )
										openNode.close();
									$node.data( 'open', node );
								}
								else {
									node.close();
									$node.data( 'open', null );
								}
								evt.preventDefault();
							} );
						$children.hide();
						descend( $children );
					}
					else
						$branch.addClass( 'tree-leaf' );
				} );
			};
			$(this).each( function() {
				var $trunk = $(this);
				descend( $trunk );
			} );
		}
	});
})(jQuery);



/**
 * Add accordion
 *
 */
(function($) {
	$.fn.extend( {
		accordion: function() {
			$(this).each( function() {
				var $trunk = $(this);
				$trunk.children( 'dt' ).each( function() {
					var $term = $(this);
					var $a = $term.wrapInner( '<a href="javascript:void(0);" />' ).children( 'a:first' );
					var $def= $term.next();
					var hdef = $def.height();
					var node = {
						open: function() {
							$a.addClass( 'selected' );
							$def.animate( {height:hdef}, 250 );
							//$def.slideDown( 250 );
						},
						close: function() {
							$a.removeClass( 'selected' );
							$def.animate( {height:0}, 250 );
							//$def.slideUp( 250 );
						}
					}
					$a.bind( 'click', function(evt) {
						if ( $a.hasClass('selected') ) {
							node.close();
							$trunk.data( 'open', null );
						}
						else {
							node.open();
							var last = $trunk.data( 'open' );
							if ( last )
								last.close();
							$trunk.data( 'open', node );
						}
					} );
				} );
				$trunk.children( 'dd' ).height( 0 );
			} );
		}
	});
})(jQuery);


/**
 * Add rotator (testimnials, client logos)
 *
 */
(function($) {
	$.fn.extend( {
		rotator: function( method, speed ) {
			method = method || 'fade';
			var $li = $(this).children( 'li' );
			if ( $li.size() > 1 ) {
				var n = 0;
				var items = [];
				$li.each( function() { items.push( $(this) ); } );
				var swap = function() {
					if ( method == 'fade' )
						items[n].fadeOut(250);
					else if ( method == 'xfade' )
						items[n].fadeOut(500);
					else if ( method == 'slide' )
						items[n].slideUp();
					n++;
					if ( n >= items.length )
						n = 0;
					if ( method == 'fade' )
						items[n].delay(250).fadeIn(250);
					else if ( method == 'xfade' )
						items[n].fadeIn(500);
					else if ( method == 'slide' )
						items[n].slideDown();
					setTimeout( function() {swap();}, Math.floor(speed*.9 + Math.random() * speed * .2) );
				};
				setTimeout( function() {swap();}, Math.floor(speed*.9 + Math.random() * speed * .2) );
			}
		}
	});
})(jQuery);


var duane = {
	
	servletPath: '',
	emailRE: /^((?:(?:(?:\w[\.\-\+]?)*)\w)+)\@((?:(?:(?:\w[\.\-\+]?){0,62})\w)+)\.(\w{2,6})$/,
	contactFields: [
		{ id:"name", reqd:true },
		{ id:"title", reqd:false },
		{ id:"company", reqd:false },
		{ id:"email", reqd:true },
		{ id:"phone", reqd:false },
		{ id:"request", reqd:false },
		{ id:"captcha", reqd:true },
		{ special:'when' }
	],
	maillistFields: [ { id:"email", reqd:true }, { special:'region', value:'1' }, { special:'optin', value:'1' } ],
	commentFields: [
		{ id:"par", reqd:false },
		{ id:"name", reqd:false },
		{ id:"email", reqd:true },
		{ id:"comment", reqd:true },
		{ id:"captcha", reqd:true },
		{ special:'date' }
	],
	askduaneFields: [
		{ id:"name", reqd:true },
		{ id:"title", reqd:false },
		{ id:"company", reqd:false },
		{ id:"email", reqd:true },
		{ id:"phone", reqd:false },
		{ id:"question", reqd:true },
		{ id:"captcha", reqd:true },
		{ special:'when' }
	],
	
	submitForm: function( options ) {
	
		var badFields = false;
		for ( var n = 0; n < options.fields.length; n++ ) {
			var f = options.fields[ n ];
			if ( f.id ) {
				var inp = options.form[ f.id ];
				if ( inp ) {
					var val = inp.value;
					if ( f.reqd && val.length == 0 ) {
						badFields = true;
						duane.exclaimField( options.list, f.id, true );
					}
					else if ( f.id == 'email' && !val.match(duane.emailRE) ) {
						badFields = true;
						duane.exclaimField( options.list, f.id, true );
					}
					else
						duane.exclaimField( options.list, f.id, false );
				}
			}
		}
		
		if ( badFields ) {
			$('#'+options.list+'_result_msg').html( '' );
			return;
		}
		
		$('#'+options.list+'_result_msg').html( '<p>Sending data....</p>' );
	
		var vars = { fmt:'json', list:options.list };
		for ( var n = 0; n < options.fields.length; n++ ) {
			var f = options.fields[ n ];
			if ( f.special ) {
				if ( f.special == 'when' || f.special == 'date' )
					vars[ f.special ] = new Date().getTime();
				else
					vars[ f.special ] = f.value;
			}
			else {
				var inp = options.form[ f.id ];
				if ( inp ) {
					if ( inp.type == "text" || inp.type == "textarea" || inp.type == "hidden" ) {
						if ( inp.value ) {
							vars[ f.id ] = inp.value;
						}
					}
					else if ( inp.type.indexOf("select") != -1 ) {
						vars[ f.id ] = inp.options[inp.selectedIndex].value;
					}
					inp.disabled = true;
				}
			}
		}
		
		$.ajax( {
			type: 'POST',
			url: duane.servletPath + (options.handler ? options.handler : 'HandleForm'),
			processData: true,
			data: vars,
			dataType: 'json',
			success: function(dta,txt) {
				var result = dta;
				if ( result.success ) {
					$('#'+options.list+'_result_msg').html( '<p>' + options.successMsg + '</p>' );
					for ( var n = 0; n < options.fields.length; n++ ) {
						var f = options.fields[ n ];
						if ( f.id ) {
							var inp = options.form[ f.id ];
							if ( inp ) {
								if ( inp.type == "text" || inp.type == "textarea" ) {
									inp.value = "";
								}
								else if ( inp.type.indexOf("select") != -1 ) {
									inp.selectedIndex = 0;
								}
								inp.disabled = false;
							}
						}
					}
					if ( options.successAlert )
						alert( options.successAlert );
				}
				else {
					$('#'+options.list+'_result_msg').html( '<p>' + unescape(result.message).replace('\n','<br />') + '</p>' );
					duane.enableFields( options.form, options.fields );
				}
			},
			error: function(r, txt, err) {
				$('#'+options.list+'_result_msg').html( '<p>An error occurred while trying to send your submission' + txt + err + '.</p>' );
				duane.enableFields( options.form, options.fields );
			}
		} );
		
	},

	enableFields: function( form, fields ) {
		for ( var n = 0; n < fields.length; n++ ) {
			var f = fields[ n ];
			if ( f.id ) {
				var inp = form[ f.id ];
				if ( inp )
					inp.disabled = false;
			}
		}
	},
	
	exclaimField: function( list, field, vis ) {
		$('#' + list + '_bad_' + field).removeClass().addClass( vis ? 'exclaim_vis' : 'exclaim' );
	},
	
	newCaptcha: function() {
		var el = document.getElementById( "captcha_image" );
		if ( el ) {
			el.src = duane.servletPath + "../captcha_image.jpg?t=" + Math.random();
		}
	},
	

	/**
	 * contact form handler
	 */
	submitContact: function() {
		try {
			duane.submitForm( {
				list:'requests', 
				form: document.forms['contact_form'],
				fields: duane.contactFields,
				successMsg: 'Your request has been received!',
				successAlert: false 
			} );
		}
		catch( e ) {
			window.console.error( e );
		}
	},
	

	/**
	 * newsletter form handler
	 */
	submitNewsletterSignup: function() {
		try {
			duane.submitForm( {
				list:'maillist', 
				form: document.forms['signup_form'],
				fields: duane.maillistFields,
				successMsg: 'You have been added to the list!',
				successAlert: 'You have been added to the list!\r\rThank you!' 
			} );
		}
		catch( e ) {
			window.console.error( e );
		}
	},
	

	/**
	 * newsletter form handler
	 */
	submitNewsletterRemove: function() {
		try {
			duane.submitForm( {
				list:'maillist',
				handler: 'Unsubscribe',
				form: document.forms['unsubscribe_form'],
				fields: duane.maillistFields,
				successMsg: 'You have been removed to the list!',
				successAlert: false 
			} );
		}
		catch( e ) {
			window.console.error( e );
		}
	},
	

	/**
	 * blog comment form handler
	 */
	submitComment: function() {
		try {
			duane.submitForm( {
				list:'blog_comments', 
				form: document.forms['comment_form'],
				fields: duane.commentFields,
				successMsg: 'Your comment has been submitted!',
				successAlert: false 
			} );
		}
		catch( e ) {
			window.console.error( e );
		}
	},
	

	/**
	 * "ask duane" form handler
	 */
	submitQuestion: function() {
		try {
			duane.submitForm( {
				list:'askduane', 
				form: document.forms['askduane_form'],
				fields: duane.askduaneFields,
				successMsg: 'Your question has been submitted!',
				successAlert: false 
			} );
		}
		catch( e ) {
			window.console.error( e );
		}
	}
	
};


$(document).ready( function() {

	/**
	 * Roll-over image swapping:
	 */
	$('.auto-roll').each( function() {
		var $self = $(this);
		var $img = $self.find('img');
		if ( $img.size() == 1 ) {
			var src = $img.attr( 'src' );
			var stuff = src.match( /\.(jpg|png|gif)/ig );
			if ( stuff && stuff.length > 0 ) {
				var extension = stuff[ stuff.length - 1 ];
				var base = src.substring( 0, src.length - extension.length );
				if ( /_up$/.test(base) )
					base = base.substring( 0, base.length - 3 );
				$.preLoadImages( base + '_over' + extension );
				$self.data( 'up', src );
				$self.data( 'over', base + '_over' + extension );
				$self.bind( 'mouseover', function() {
						$img.attr( 'src', $self.data('over') );
					} )
					.bind( 'mouseout', function() {
						$img.attr( 'src', $self.data('up') );
					} );
			}
		}
	} );
	
	/**
	 * year-month tree views:
	 */
	$('.archive-tree').treeView();
	
	/**
	 * video players:
	 */
	var $flvideo = $('.flvideo');
	if ( $flvideo.size() > 0 ) {
		$.getScript( duane.webpath + 'i/fp.js', function() {
			$flvideo.each( function() {
				var $self = $(this);
				var files = $self.find('.flvideo-file').text();
				if ( files.length > 0 ) {
					var fileParts = files.split( ',' );
					var ff = duane.webpath + 'i/video_player.swf?&vv=1.2a&v=' + fileParts[0] + '&p=' + fileParts[1];
					var fe = new FlashEmbed( ff, 8, ''+$self.width(), ''+$self.height(), "#000000" );
					fe.setParam( 'wmode', 'transparent' );
					$self.html( fe.getHtml() );
					$self.height( $self.height() );
				}
			});
		});
	}
	
	$('#qa-list').accordion();
	
	$('.testimonial-list').rotator( 'slide', 8000 );
	$('.client-list').rotator( 'fade', 2000 );
	$('.slideshow').rotator( 'xfade', 3000 );
	$('.topslide').rotator( 'xfade', 3000 );
	
	
	$("input.hinted").ezpz_hint();
		
} );




