/*

Developed by:

      ___           ___                 
     /__/|         /__/\        ___     
    |  |:|         \  \:\      /  /\    
    |  |:|          \  \:\    /  /:/    
  __|  |:|      _____\__\:\  /__/::\    
 /__/\_|:|____ /__/::::::::\ \__\/\:\__ 
 \  \:\/:::::/ \  \:\~~\~~\/    \  \:\/\
  \  \::/~~~~   \  \:\  ~~~      \__\::/
   \  \:\        \  \:\          /__/:/ 
    \  \:\        \  \:\         \__\/  
     \__\/         \__\/               

*/

/*******************************
  Debug & Console
*******************************/
// Allow for console.log to not break IE
if (typeof console == "undefined" || typeof console.log == "undefined") {
	var console = { 
		log: function() {}
	};
}
/*******************************
  Configuration Settings
*******************************/

// Declare Global Namespace
if(typeof(base) == 'undefined') {
	var base = {};	
}


/* Account Configuration */
base.settings = {
	
	urlRoot: "/projects/specialized/wb/deploy",
	
	minimumFlashVersion: '9.0.0',
	
	// language
	language: 'en-us',
	
	// Number of items in each artwork view row, used for calculating special classnames
	artworkItemsPerRow: 3,
	
	// Number of items in each saved bottle view row, used for calculating special classnames
	bottleItemsPerRow: 5,
	
	// message sent to user when they attempt to delete artwork
	confirmDeleteMessage: "This action can not be undone. Are you sure you want to proceed?",
	
	// add to cart error
	addToCartErrorMessage: "This bottle could not be added to your cart. Please contact an administrator.",
	
	// please add some bottles
	addBottlesRequest: "Please include a quantity for each of your desired bottle styles.",
	
	// general error
	errorSaving: "There was an error saving your information. Please contact an administrator.",
	
	// file could not be deleted
	errorFileDelete: "File could not be deleted. Please notify an administrator",
	
	// empty cart
	errorEmptyingCart: "There was an error emptying your cart. Please contact an administrator.",
	
	// trying to approve an approved bottle
	alreadyApproved: "This bottle has already been approved for production.",
	
	// HTML inserted into list to create divider
	listDividerHTML: "<div class=\'divider\'></div>",
	
	// location of uploaded art
	mediaDir: "_media/_img/upload/",
	
	// JSON Feed for More News
	newsFeed: '_json/news.json',
	
	priceAPI: 'api/cart/price/',
	
	cartAPI: 'api/cart/save/',
	
	// the bottle ID we receive from the bottle builder
	bottleBuilderID: 0,
	
	// stores user id if they login via modal
	userID: 0
	
};
jQuery.extend(base, base.settings);


/*******************************
       Internal Config
 ******************************/
 
 // t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});


base.internals = {
	// used to track animation queue 
	animating: false,
	cookies: {},
	photogalleryOptions: { 
		animSequence: 'sync',
		overlayColor: '#FFFFFF',
		overlayOpacity: '0.9',
		flvPlayer: 'swf/utils/flvplayer.swf',
		onFinish: function() {
			var $close = $('#shadowbox_body .close');
			$close.unbind().hover(function(){
				$(this).addClass('hover');											 
			},	function() {
				$(this).removeClass('hover');
			});	
		},
		onOpen: function() {
			$('#content #gallery ul li a img').css({ visibility: 'hidden'});	
		},
		onClose: function() {
			$('#content #gallery ul li a img').css({ visibility: 'visible'});				
		}
	}
}
jQuery.extend(base, base.internals);

// after attached to base, unset temp. settings object 
delete base.internals;
	
/*******************************
 	Error Messages
*******************************/

// Declare error namespace
base.errors = {};	


/* Service Error Messages */
base.settings = {
	// if AJAX request times out
	timeOutError: "Request timed out",
	
	// Generic no results error
	noResultsError: "We're sorry there are no results available for your query",
	
	// AJAX returns a server-side error message instead of a data object
	malformedResponseError: "We're currently experiencing technical difficulties, please check back later"
};
jQuery.extend(base.errors, base.settings);


/* Form Error Messages */
base.settings = {
	// Generic error message displayed above a form if using inline warnings
	generic: "This field is required",
	
	// Text before a list of errors to fix 
	errorListTitle: "Please fix the following errors:",
	
	// No first name entered
	noFirstName: "Please enter a first name",
	
	// No last name entered
	noLastName: "Please enter a last name",
	
	// No email entered
	noEmail: "Please enter an email address",
	
	// Invalid email entered
	invalidEmail: "Please enter a valid email address",
	
	// No contact subject has been entered 
	noSubject: "Please enter a subject",
	
	// No contact message has been entered
	noMessage: "Please enter a message",
	
	// Email address does not match confirmation email address
	emailMatch: "Please verify that your confirmation email matches your email address",
	
	// passwords do not match
	passwordMatch: "Passwords do not match",
	
	// provide password
	passwordBlank: "Please provide a password",

	// blank fields
	noAddress: "Please provide an address",
	noCity: "Please provide a city",
	noState: "Please select a state",
	noCountry: "Please select a country",
	noZipcode: "Please enter your zip code",
	noPhone: "Please enter a phone number",
	noCompany: "Please enter a company name",
	noAccount: "Provide a Specialized Account Number",
	noResale: "Provide a Resale Account Number"
	
	
	
};
jQuery.extend(base.errors, base.settings);


// after attached to base, unset temporary settings object 
delete base.settings;
