function $tryCatch(){
    for (var i = 0, l = arguments.length; i < l; i++){
        try {
            return arguments[i]();
        } catch(e){}
    }
    return null;
};

var Browser = {

    Engine: {name: 'unknown', version: 0},

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},

    Plugins: {},

    Engines: {

        presto: function(){
            return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
        },

        trident: function(){
            return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
        },

        webkit: function(){
            return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
        },

        gecko: function(){
            return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18);
        }

    }

};

Browser.Platform[Browser.Platform.name] = true;

Browser.detect = function(){

    for (var engine in this.Engines){
        var version = this.Engines[engine]();
        if (version){
            this.Engine = {name: engine, version: version};
            this.Engine[engine] = this.Engine[engine + version] = true;
            break;
        }
    }

    return {name: engine, version: version};

};

Browser.detect();

Browser.Request = function(){
    return $tryCatch(function(){
        return new XMLHttpRequest();
    }, function(){
        return new ActiveXObject('MSXML2.XMLHTTP');
    }, function(){
        return new ActiveXObject('Microsoft.XMLHTTP');
    });
};

Browser.Features.xhr = !!(Browser.Request());

Browser.Plugins.Flash = (function(){
    var version = ($tryCatch(function(){
        return navigator.plugins['Shockwave Flash'].description;
    }, function(){
        return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
    }) || '0 r0').match(/\d+/g);
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
})();

function $exec(text){
    if (!text) return text;
    if (window.execScript){
        window.execScript(text);
    } else {
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
        document.head.appendChild(script);
        document.head.removeChild(script);
    }
    return text;
};

/**
* author Remy Sharp
* url http://remysharp.com/tag/marquee
*/

(function ($) {
    $.fn.marquee = function (klass) {
        var newMarquee = [],
            last = this.length;

        // works out the left or right hand reset position, based on scroll
        // behavior, current direction and new direction
        function getReset(newDir, marqueeRedux, marqueeState) {
            var behavior = marqueeState.behavior, width = marqueeState.width, dir = marqueeState.dir;
            var r = 0;
            if (behavior == 'alternate') {
                r = newDir == 1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : width;
            } else if (behavior == 'slide') {
                if (newDir == -1) {
                    r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] : width;
                } else {
                    r = dir == -1 ? marqueeRedux[marqueeState.widthAxis] - (width*2) : 0;
                }
            } else {
                r = newDir == -1 ? marqueeRedux[marqueeState.widthAxis] : 0;
            }
            return r;
        }

        // single "thread" animation
        function animateMarquee() {
            var i = newMarquee.length,
                marqueeRedux = null,
                $marqueeRedux = null,
                marqueeState = {},
                newMarqueeList = [],
                hitedge = false;
                
            while (i--) {
                marqueeRedux = newMarquee[i];
                $marqueeRedux = $(marqueeRedux);
                marqueeState = $marqueeRedux.data('marqueeState');
                
                if ($marqueeRedux.data('paused') !== true) {
                    // TODO read scrollamount, dir, behavior, loops and last from data
                    marqueeRedux[marqueeState.axis] += (marqueeState.scrollamount * marqueeState.dir);

                    // only true if it's hit the end
                    hitedge = marqueeState.dir == -1 ? marqueeRedux[marqueeState.axis] <= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState) : marqueeRedux[marqueeState.axis] >= getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);
                    
                    if ((marqueeState.behavior == 'scroll' && marqueeState.last == marqueeRedux[marqueeState.axis]) || (marqueeState.behavior == 'alternate' && hitedge && marqueeState.last != -1) || (marqueeState.behavior == 'slide' && hitedge && marqueeState.last != -1)) {                        
                        if (marqueeState.behavior == 'alternate') {
                            marqueeState.dir *= -1; // flip
                        }
                        marqueeState.last = -1;

                        $marqueeRedux.trigger('stop');

                        marqueeState.loops--;
                        if (marqueeState.loops === 0) {
                            if (marqueeState.behavior != 'slide') {
                                marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
                            } else {
                                // corrects the position
                                marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir * -1, marqueeRedux, marqueeState);
                            }

                            $marqueeRedux.trigger('end');
                        } else {
                            // keep this marquee going
                            newMarqueeList.push(marqueeRedux);
                            $marqueeRedux.trigger('start');
                            marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
                        }
                    } else {
                        newMarqueeList.push(marqueeRedux);
                    }
                    marqueeState.last = marqueeRedux[marqueeState.axis];

                    // store updated state only if we ran an animation
                    $marqueeRedux.data('marqueeState', marqueeState);
                } else {
                    // even though it's paused, keep it in the list
                    newMarqueeList.push(marqueeRedux);                    
                }
            }

            newMarquee = newMarqueeList;
            
            if (newMarquee.length) {
                setTimeout(animateMarquee, 25);
            }            
        }
        
        // TODO consider whether using .html() in the wrapping process could lead to loosing predefined events...
        this.each(function (i) {
            var $marquee = $(this),
                width = $marquee.attr('width') || $marquee.width(),
                height = $marquee.attr('height') || $marquee.height(),
                $marqueeRedux = $marquee.after('<div ' + (klass ? 'class="' + klass + '" ' : '') + 'style="display: block-inline; width: ' + width + 'px; height: ' + height + 'px; overflow: hidden;"><div style="float: left; white-space: nowrap;">' + $marquee.html() + '</div></div>').next(),
                marqueeRedux = $marqueeRedux.get(0),
                hitedge = 0,
                direction = ($marquee.attr('direction') || 'left').toLowerCase(),
                marqueeState = {
                    dir : /down|right/.test(direction) ? -1 : 1,
                    axis : /left|right/.test(direction) ? 'scrollLeft' : 'scrollTop',
                    widthAxis : /left|right/.test(direction) ? 'scrollWidth' : 'scrollHeight',
                    last : -1,
                    loops : $marquee.attr('loop') || -1,
                    scrollamount : $marquee.attr('scrollamount') || this.scrollAmount || 2,
                    behavior : ($marquee.attr('behavior') || 'scroll').toLowerCase(),
                    width : /left|right/.test(direction) ? width : height
                };
            
            // corrects a bug in Firefox - the default loops for slide is -1
            if ($marquee.attr('loop') == -1 && marqueeState.behavior == 'slide') {
                marqueeState.loops = 1;
            }

            $marquee.remove();
            
            // add padding
            if (/left|right/.test(direction)) {
                $marqueeRedux.find('> div').css('padding', '0 ' + width + 'px');
            } else {
                $marqueeRedux.find('> div').css('padding', height + 'px 0');
            }
            
            // events
            $marqueeRedux.bind('stop', function () {
                $marqueeRedux.data('paused', true);
            }).bind('pause', function () {
                $marqueeRedux.data('paused', true);
            }).bind('start', function () {
                $marqueeRedux.data('paused', false);
            }).bind('unpause', function () {
                $marqueeRedux.data('paused', false);
            }).data('marqueeState', marqueeState); // finally: store the state
            
            // todo - rerender event allowing us to do an ajax hit and redraw the marquee

            newMarquee.push(marqueeRedux);

            marqueeRedux[marqueeState.axis] = getReset(marqueeState.dir, marqueeRedux, marqueeState);
            $marqueeRedux.trigger('start');
            
            // on the very last marquee, trigger the animation
            if (i+1 == last) {
                animateMarquee();
            }
        });            

        return $(newMarquee);
    };
}(jQuery));

/*  Transpose v0.91 - jQuery-powered plugin that transitions list items automatically, manually on user-demand, or both.
 *	(c) Jeremy Wynn 
 * 	MIT License
 *	
 * 	v0.91 - Slight Code Optimization.  Completely made motion type modular.
 */

/*global $: false clearInterval: false document: false setInterval: false Transpose: false Transpose: true jQuery: false*/

"use strict";

(function ($) {		
	var Transpose = {		
		setup: function (element, options) {
			element = "#" + jQuery(element.id).selector;
			var defaults = {
				automatic: true,
				autoRestart: true,
				targetId: element,
				motion: 'fade',
				motionTimer: 'fast',
				nextId: 'target-right',
				paginator: false,
				paginatorCurrent: 'current',
				paginatorId: 'paginator',
				paginatorLabel: false,
				pointerId: 'hero_pointer', 
				prevId: 'target-left',
				prevNext: false,
				timer: 10000
			},
		    config = jQuery.extend(defaults, options || {});
			return config;
		},	
		launch: function (settings) {
			this.settings = settings;
			this.motion.determine();
			this.targetCount = jQuery(settings.targetId + " > li").size();
			this.pointerXPos = [118, 352, 592, 827];
			if (this.motion.chosen === this.motion.fade) {
				jQuery(settings.targetId + ' li:not(:first)').hide().css('opacity', '0');
			}
			else {
				jQuery(settings.targetId + ' li:not(:first)').hide();
			}			
			jQuery(settings.targetId + ' li:first').show().addClass('active');
			if (settings.automatic) {
				Transpose.startTimer(settings.timer);
			}
			if (settings.prevNext) {
				Transpose.prevNext();
			}
			if (settings.paginator) {
				this.paginator.buildPaginator();
			}
		},
		autoStart: function () { 
			Transpose.motion.chosen();
		},
		index: {
			currentIndex: 0,
			modifyIndex: function (selectedBanner, alteredIndex, direction) {
				if (alteredIndex !== undefined) {
					if (jQuery(Transpose.settings.targetId + " :animated").length > 0) {
						return false;
					}
					else {
						if (alteredIndex === -1) {
							alteredIndex = Transpose.targetCount - 1;
							selectedBanner = jQuery(Transpose.settings.targetId + " li").eq(alteredIndex);
						}
						else if (alteredIndex === -2) {
							alteredIndex = Transpose.targetCount - 2;
							selectedBanner = jQuery(Transpose.settings.targetId + " li").eq(alteredIndex);
						}					

						if (this.currentIndex < alteredIndex) {
							var transition = 'forward';
						}
						else {
							var transition = 'backward';
						}
						
						if (direction && direction.id == Transpose.settings.prevId) {
							transition = 'backward';
						}

						// Prevent index from being greater than or equal than the number of targets						
						if (this.currentIndex > Transpose.targetCount - 1) {
							this.currentIndex = 0;
						}

						else {
							this.currentIndex = alteredIndex;
						}
						
						if (this.currentIndex === Transpose.targetCount) { 
							this.currentIndex = 0;
							alteredIndex = 0; 
							selectedBanner = jQuery(Transpose.settings.targetId + " li").eq(0);
						}						
												
						Transpose.motion.chosen(selectedBanner, alteredIndex, transition);
					}
				} else {			
					this.currentIndex += 1;
					if (this.currentIndex === Transpose.targetCount) { 
						this.currentIndex = 0; 
					}
				}
			}
		},
		motion: {
			chosen: '',
			determine: function () {
				switch (Transpose.settings.motion) {
					case "fade":
						this.chosen = this.fade;
					break;
					case "slideHorizontal":
                        this.chosen = this.slideHorizontal;
                    break;
					case "slideVertical":
                        this.chosen = this.slideVertical;
                    break;
					default:
						this.chosen = this.fade;
				}
			},
			fade: function (selectedBanner, alteredIndex) {
				var activeTarget = jQuery(Transpose.settings.targetId + " li.active");
				activeTarget.fadeTo(Transpose.settings.motionTimer, 0, function () {
					activeTarget.hide();  //Necessary or earlier anchor hrefs won't update
					Transpose.updateStatus.target(this);															
					if (selectedBanner === undefined) {					    
					    Transpose.index.modifyIndex();					    
						jQuery(Transpose.settings.targetId + " li").eq(Transpose.index.currentIndex).show().fadeTo(Transpose.settings.motionTimer, 1, function () {					    
							Transpose.updateStatus.target(this);										
						});		
					}
					else {
						jQuery(selectedBanner).show().fadeTo(Transpose.settings.motionTimer, 1, function () {
							Transpose.updateStatus.target(this);
							if (Transpose.settings.autoRestart) {
								Transpose.startTimer(Transpose.settings.timer);
							}
						});
					}					
					Transpose.updateStatus.paginator(alteredIndex);					
				});	
			},
			movePointer: function (bucket) {
				var leftPos, 
					pointer = $('#hero_pointer'), 
					curPos = parseInt(pointer.css('left')), 
					desPos = Transpose.pointerXPos[bucket], 
					leftPos = (desPos - curPos);
				pointer.animate({
					left: '+=' + leftPos
				}, Transpose.settings.motionTimer);
			},
			slideHorizontal: function (selectedBanner, alteredIndex, direction) {
                var tWidth = jQuery(Transpose.settings.targetId).width();
                var activeTarget = jQuery(Transpose.settings.targetId + " li.active");
                if (selectedBanner === undefined) {
					Transpose.index.modifyIndex();
					var nextTarget = jQuery(Transpose.settings.targetId + " li").eq(Transpose.index.currentIndex);
					nextTarget.css('left', tWidth).show();
					activeTarget.animate({
						left: '-=' + tWidth
					}, Transpose.settings.motionTimer, function () {
						activeTarget.hide();               
					});                 
					nextTarget.animate({
						left: '0'
					}, Transpose.settings.motionTimer);
					Transpose.motion.movePointer(Transpose.index.currentIndex);
					Transpose.updateStatus.target(activeTarget);
					Transpose.updateStatus.target(nextTarget);
					Transpose.updateStatus.paginator(alteredIndex);
                }
                else {
                    var nextTarget = jQuery(selectedBanner);
                    if (direction === 'forward') {
                    	
	                	// Transition Forward
	                    nextTarget.css('left', tWidth).show();
	                    activeTarget.animate({
	                        left: '-=' + tWidth
	                    }, Transpose.settings.motionTimer, function () {
	                        activeTarget.hide();               
	                    });
	                    nextTarget.animate({
	                        left: '0'
	                    }, Transpose.settings.motionTimer, function () {
	                        Transpose.updateStatus.target(activeTarget);
	                        Transpose.updateStatus.target(nextTarget);
	                        Transpose.updateStatus.paginator(alteredIndex); 
	                        if (Transpose.settings.autoRestart) {
	                            Transpose.startTimer(Transpose.settings.timer);
	                        }
	                    });
	                    
                        
                    }
                    
                    else {
                    	// Transition Backward
                        nextTarget.css('left', -tWidth).show();
                        activeTarget.animate({
                            left: '+=' + tWidth
                        }, Transpose.settings.motionTimer, function () {
                            activeTarget.hide();               
                        });
                        nextTarget.animate({
                            left: '0'
                        }, Transpose.settings.motionTimer, function () {
                            Transpose.updateStatus.target(activeTarget);
                            Transpose.updateStatus.target(nextTarget);
                            Transpose.updateStatus.paginator(alteredIndex); 
                            if (Transpose.settings.autoRestart) {
                                Transpose.startTimer(Transpose.settings.timer);
                            }
                        });
                    }
                    Transpose.motion.movePointer(alteredIndex);
                    
                }
			}
		},
		paginator: {
			buildPaginator: function () {
				this.createPanel();
				this.assignNodes();
				jQuery("#" + Transpose.settings.paginatorId + " li a" + ".target0").addClass(Transpose.settings.paginatorCurrent);
			},
			createPanel: function () {
				var targetController = document.createElement("ul"),
			    counter = 0;
				targetController.id = Transpose.settings.paginatorId;	
				for (; counter < Transpose.targetCount; counter += 1) {
					this.createNode(counter, targetController);
				}
				jQuery(Transpose.settings.targetId).after(targetController);			
			},
			createNode: function (counter, targetController) {
				var targetAnchor = document.createElement("a"),
				li = document.createElement("li");
				targetAnchor.setAttribute('href', '#');
				targetAnchor.className = "target" + counter;
				li.appendChild(targetAnchor);
				targetController.appendChild(li);
				if (Transpose.settings.paginatorLabel) {
					this.labelNodes(targetAnchor, counter);
				}
			},
			labelNodes: function (targetAnchor, counter) {
				var anchorText = document.createTextNode(counter + 1);
				targetAnchor.appendChild(anchorText);
			},
			individualAssigner: function (i) {
				jQuery("#" + Transpose.settings.paginatorId + " li a" + ".target" + i).click(function () {
					if (jQuery(this).hasClass(Transpose.settings.paginatorCurrent)) {
						return false;
					}
					clearInterval(Transpose.timer);
					Transpose.index.modifyIndex(jQuery(Transpose.settings.targetId + " li").eq(i), i);
					return false;
				});
			},
			assignNodes: function () {
				for (var i = 0; i < Transpose.targetCount; i += 1) {
					this.individualAssigner(i);	
				}
			}
		},
		prevNext: function () {
			nextButton = document.createElement("a");
			nextButton.id = Transpose.settings.nextId;
			nextButton.setAttribute('href', '#');
			jQuery(Transpose.settings.targetId).append(nextButton);
			jQuery("#" + Transpose.settings.nextId).click(function () {
				clearInterval(Transpose.timer);
				Transpose.index.modifyIndex(jQuery(Transpose.settings.targetId + " li").eq(Transpose.index.currentIndex + 1), Transpose.index.currentIndex + 1, this);
				return false;
			});
		},
		startTimer: function (milliseconds) {
			clearInterval(Transpose.timer);
			Transpose.timer = setInterval(Transpose.autoStart, Transpose.settings.timer);
		},
		updateStatus: {
			paginator: function (alteredIndex) {
				var contNode = jQuery("#" + Transpose.settings.paginatorId + " li a");
				contNode.removeClass(Transpose.settings.paginatorCurrent);
				if (alteredIndex !== undefined) {
					jQuery("#" + Transpose.settings.paginatorId + " li a" + ".target" + alteredIndex).addClass(Transpose.settings.paginatorCurrent);
				}
				else {
					jQuery("#" + Transpose.settings.paginatorId + " li a" + ".target" + Transpose.index.currentIndex).addClass(Transpose.settings.paginatorCurrent);
				}
			},
			target: function (target) {
				jQuery(target).toggleClass('active');
			}		
		}		
	};
	jQuery.fn.transpose = function (options) {
		return this.each(function () {
			
			if (jQuery(this).data('transpose')) {
				return;
			}
			var settings = new Transpose.setup(this, options);
			Transpose.launch(settings);			
		});		
	};
}(jQuery));

// Quick Contact Form Label Handler
var labelHandler = function (formControl, searchStr) {
	if ($(formControl).attr("value") == searchStr) {
		$(formControl).attr("value", "");
	}
	$(formControl).blur(function () {
		if ($(formControl).attr("value") == "") {
			$(formControl).attr("value", searchStr);
		}
	});
}

/*
// Calculator Functions
var clearForm = function (form) {
	form.reset();
}
*/
$(document).ready(function(){
	/*
	// Metric Conversion Calculators
	$('.calculator input[type="text"]').val('');
	$('.calculator input[type="text"]').focus(function () {
		clearForm(this.form);	
	});
	$('.calculator input[type="text"]').blur(function () {
		if ($(this).val().length > 0) {
			$(this).addClass('base');
		}
		else {
			$(this).removeClass('base');
		}
	});
	$('.calculate').click(function () {
		console.log($(this.form).find('input.base').val());
	});
	*/
	// Home Hero
	$('#hero_images').transpose({
		motion: 'slideHorizontal',
		motionTimer: '400',
		nextId: 'target_right',
		paginator: true,
		paginatorId: 'hero_controller',
		prevNext: true
	});
	
	// Stock Tank Options of Quick Form
	var tankOptions = $('#quick_contact #tank_options');
	tankOptions.css('display', 'none'); 	
	$('#need_tank').css('cursor', 'pointer').click(function () {
		tankOptions.slideDown();
	});
	
	// Bucket Expanders for Internal Page
	var dbExpander = $('#details_buckets .expander');
	$('#details_buckets .db_content').css('display', 'none');
	dbExpander.css({
		'background-position' : '0 -43px',
		'cursor' : 'pointer'
	}).each(function () {
		var self = $(this);
		self.click(function () {
			self.toggleClass('expanded').next('.db_content').slideToggle();
			if (!self.is('.expanded')) {
				self.css('background-position', '0 -43px');
			}
			else {
				self.css('background-position', '0 0');
			}
		});
	});
	
	// Product Galleries
	
	if (Browser.Engine.trident4) { //IE6 or similar detected
		$('.product_thumbs li a').each(function () {
			var self = $(this);
			var mainImgSrc = self.attr('href');
			//fullImgs.push(mainImgSrc);
			self.hover(function () {				
				$('.product_gallery .current_img').attr('src', mainImgSrc);
			});
			self.click(function () {
				return false;
			});
		});
	}
	else {
		$('.product_thumbs li a').each(function () {
			var self = $(this);
			var mainImgSrc = self.attr('href');
			//fullImgs.push(mainImgSrc);
			self.hover(function () {
				$('.product_thumbs a.current').removeClass('current');
				self.addClass('current');
				$('.product_gallery .current_img').attr('src', mainImgSrc);
			});
			self.click(function () {
				return false;
			});
		});
	}
	
	//Quick Form Label Handling Function Calls
	$("#quick_contact #contact-name").focus(function () {
		labelHandler(this, "Name *");
	});
	$("#quick_contact #contact-email").focus(function () {
		labelHandler(this, "E-mail *");
	});
	$("#quick_contact #contact-state").focus(function () {
		labelHandler(this, "State *");
	});
	$("#quick_contact #contact-country").focus(function () {
		labelHandler(this, "Country *");
	});
	$("#quick_contact #contact-phone").focus(function () {
		labelHandler(this, "Phone");
	});
	$("#quick_contact #contact-comment").focus(function () {
		labelHandler(this, "Question *");
	});
	
	// Stripy Tables
	$('tbody.stripy tr:odd').addClass('altRow');
	
	// Google Translate
	$('#gTranslate').click(function() {
		$('#translations').slideToggle();
		return false;
	});
	$('#translations').hover(function() {}, function() {
		$(this).slideUp();
	});
	
	// Colorbox
	$('a.modal').colorbox();
	
	// Sticky Float
	if ($('#right_column').length > 0) {
		$('#right_column').stickyfloat({ duration: 800, offsetY: 100 });
	}
	
	// Stock Ticker Marquee
	$('#stock_ticker').marquee('ticker');
});
