/** 
 * RossCairns.com rc.js
 * @copyright RossCairns.com 
 * @author Ross Cairns 
 * @version v0.2.2
 * @package com.rosscairns.rcjs
 *
 * @todo make a selective include jquery plugin for following plugins
 *
 **/
 
/*****************************************
 * @name Layout Utitlies -jQuery
 * 
 * @{
*****************************************/ 

/*****************************************
 * @name Gridding
 * @todo Make a global grid object for mutliple features
 * @{
*****************************************/ 

(function($){
	/// Default Grid Object
	var _defaultGrid = {
		marginLeft: 			0,
		marginTop: 			0,
		spacingX: 				10,
		columnMarginLeft:		0,
		columnMarginRight:	0,
	}
	
	/** 
	* Set the global grid object by extending the defaut grid.
	*
	* @see var _defaultGrid
	*/
	jQuery.gridSet = function (grid) {
		_defaultGrid  = jQuery.extend(_defaultGrid, grid);
	}
	
	/** 
	* Size  items width to the next grid unit 
	* 
	* @param 	object 	grid 	optional: grid object with { spacing-x: }
	*
	* @remarks	Usage: \code	
	*						$('header').gridSizeToNextWidth(); // multiple of 10;
	*						$('header').gridSizeToNextWidth({spacing-x: 40}); // multiple of 40;
	*					\endcode
	*
	* @todo	have an option to specify column margin placement 
	*/
	jQuery.fn.gridSizeToNextWidth = function(grid) {
		
		grid = jQuery.extend(_defaultGrid, grid);
		
	  	return this.each(function(){
	    	var currentWidth = jQuery(this).outerWidth();
	    	var paddingAndBorder = currentWidth - jQuery(this).width();
	    	if (currentWidth % grid.spacingX < 0.1) return; // 0.1 is the tollerence
			jQuery(this).width((grid.spacingX * (Math.floor(currentWidth / grid.spacingX) - 1)) - paddingAndBorder);
	  	});
	};
})(jQuery)
//@}

//@}

/*****************************************
 * @name Utilites Function - Independant
 * 
 * @{
 *****************************************/ 
 
/**
* Underscore Selector Cache  
* @param	string	selector e.g. "li a"
* @return	jQuery	returns a jQuery object of matched selectors
* 
* @remarks	Usage: \code	
*						
*					\endcode
*/
underscoreSelectorCache = function (selector) {
	if(!jQuery.underscoreSelectorCache)
		jQuery.underscoreSelectorCache = {
			cache: {}
		};
	
	// get LINT's repeatSelector state
	var lintRepeatReporting = false;  
	if(jQuery.LINT) 
		lintRepeatReporting = jQuery.LINT.specific.repeatSelector;
	
	// disarm LINT's repeatSelector 
	jQuery.LINT.specific.repeatSelector = false;

	if(!jQuery.underscoreSelectorCache.cache[selector])
		jQuery.underscoreSelectorCache.cache[selector] = $(selector);
	
	// return LINT's repeatSelector state to previous
	if(jQuery.LINT)
		jQuery.LINT.specific.repeatSelector = lintRepeatReporting;
		
	return jQuery.underscoreSelectorCache.cache[selector];
}

underscoreSelectorCacheRecache = function (selector) {
	if(!jQuery.underscoreSelectorCache)
		jQuery.underscoreSelectorCache = {
			cache: {}
		};

	jQuery.underscoreSelectorCache.cache[selector] = $(selector);
		
	return jQuery.underscoreSelectorCache.cache[selector];
}

underscoreSelectorCacheClear = function () {
	jQuery.underscoreSelectorCache = {
			cache: {}
	};
}

if(!window._) window._ = underscoreSelectorCache;
if(!window.__) window.__ = underscoreSelectorCacheRecache;
if(!window.__all) window.__ = underscoreSelectorCacheClear;



//@}

/**
 *	Quick loggin'
 *	@param	object	thing to log
 *	@usage	
 */
function log(msg){
	console.log(msg);
	return this;
}
function l(msg) {
	return log(msg);
}

//@}

/*****************************************
 * @name Utilites Function - jQuery
 * 
 * @{
 *****************************************/ 

if (typeof jQuery != 'undefined') {     
	jQuery.fn.debug = function() {
	  return this.each(function(){
	    console.log(this);
	  });
	};
	jQuery.log = function(message) {
	  if(window.console) {
	     console.debug(message);
	  } else {
	     alert(message);
	  }
	};
       
} 

//@}
