(function($) {
	/**
     * toggleManager - jQuery plugin for opening content with navigation(s)
     * @constructor
     * @author Kamil Andrzejewski @ NVIsolutions
	 * @see metadata plugin http://plugins.jquery.com/project/metadata
	 *
	 * @supports ////////
	 * @supports ////////
     *
     * @example
     *
     * @example widh metadata plugin
     * 
     * @defaults toggleManager.defaults
	 * @param FUNCTION 	onOpen 					- Function to be called when opening content
	 * @param FUNCTION 	onClose					- Function to be called when closing content
	 * @param BOOL 		singleContent			- Allows only one content to be opened at once
	 * @param STRING	navigationActivedClass	- Class for activated navigation option
	 * @param ARRAY 	navigations			 	- REQUIRED Navigation elements per nav;
	 * @param JQUERY	defaultOpenedContent	- Elements of contents to be left open by default on page load
     * @returns jQuery
     */
	$.fn.toggleManager = function(options) {
		var settings = $.extend({}, $.fn.toggleManager.defaults, options);
		var metadataActive = ($().metadata) ? true : false;
		var dataArray = new Array();
		init(this, settings.navigations);
		
    	/**
    	 * init - call to event initialisation and setup
    	 * @param contentElements - you need to pass "this" from the constructor
		 * @param navArray - nav elements from settings
    	 */
    	function init(contentElements, navArray){
			if(verifyData(contentElements, navArray)){
				asignEvents();
				
				var openIndexes = Array();
				if(settings.defaultOpenedContent){
					settings.defaultOpenedContent.each(function(){
						openIndexes.push(contentElements.index(this));
					});
				}
				hideContent(openIndexes, true);
			}
 		};
		
		/**
    	 * verifyData - verification if all elements are present for initialisation & dataArray creation
    	 * @param contentElements - from the constructor, the content elements
		 * @param navArray - from the settings, the navigation elements
    	 * @return BOOL
    	 */
    	function verifyData(contentElements, navArray){
			if(contentData(contentElements) == navData(navArray)){
				return true;
			}else{
				alert("TOGGLE ERROR - Nav quantity MUST EQUAL Content quantity");
			}
		}
		
		/**
    	 * navData - verification if all content elements are present for initialisation & creation of content object in dataArray
		 * @param contentElements - from the init, the content elements
    	 * @return INTEGER contentsCounter - integer representing the total dataRows of contents
    	 */
    	function contentData(contentElements){
			var contentsCounter = contentElements.length;
			contentElements.each(function(){
				dataArray.push({nav: Array(), content: $(this), data: {}});
			});
			return contentsCounter;
		}
		
		/**
    	 * navData - verification if all nav elements are present for initialisation & creation of nav object in dataArray
		 * @param navContainer - from the settings, the navigation container
    	 * @return INTEGER navsCounter - integer representing the total dataRows of navs
    	 */
    	function navData(navArray){
			var navsCounter = 0;
			for(var n=0; n<navArray.length; n++){
				navsCounter = 0;
				navArray[n].each(function(){
					dataArray[navsCounter].nav.push($(this));
					navsCounter++;
				});
			}
			return navsCounter;
		}
		
		/**
    	 * asignEvents - assign nav interaction to content
    	 */
    	function asignEvents(){
			for(var x=0; x<dataArray.length; x++){
				dataArray[x].content.bind("onOpen", settings.onOpen);
				dataArray[x].content.bind("onClose", settings.onClose);
				for(var n=0; n<settings.navigations.length; n++){
					dataArray[x].nav[n].bind("click", x, toggleContent);
				}
			}
		}
		
		/**
    	 * toggleContent - init the assigned content and nav actions
    	 * @param event - jQuery event with content index object as data
    	 */
    	function toggleContent(event){
			var content = dataArray[event.data].content;
			if(settings.singleContent) {
				hideContent();
				verifyGoogleMaps(event.data);
				content.trigger("onOpen");
			}else{
				if(content.is(":visible")){
					content.trigger("onClose");
				}else{
					verifyGoogleMaps(event.data);
					content.trigger("onOpen");
				}
			}
			
			for(var n=0; n<settings.navigations.length; n++){
				dataArray[event.data].nav[n].toggleClass(settings.navigationActivedClass);
			}
				
		}
		
		/**
    	 * verifygoogleMaps - resets Iframe for googleMaps centering
		 * @param event - index object as data
    	 */
		function verifyGoogleMaps(index){
			var content = dataArray[index].content;
			var googleReset = dataArray[index].data.googleReset;
			var iFrames = content.find("iframe");
			if(iFrames.length > 0 && googleReset != true){
				iFrames.each(function(){
					if($(this).attr("src").search("maps.google") != -1){
						var srcDump = $(this).attr("src");
						$(this).attr("src", srcDump);
						dataArray[index].data.googleReset = true;
					}
				});
			}
		}
		
		/**
    	 * hideContent - hides all content and disable coresponding nav except indexes in param
		 * @param exceptionIndexes - index of content elements to be left enabled
		 * @param noAnim - if triggers and custom events are to be used
    	 */
    	function hideContent(exceptionIndexes, noAnim){
			if(!exceptionIndexes) exceptionIndexes = [];
			for(var e=0; e<dataArray.length; e++){ 
				dataArray[e].content.stop(true, true);
				noAnim ? dataArray[e].content.hide() : dataArray[e].content.trigger("onClose");
				for(var n=0; n<settings.navigations.length; n++) dataArray[e].nav[n].removeClass(settings.navigationActivedClass);
			}
			
			for(var x=0; x<exceptionIndexes.length; x++){ 
				dataArray[exceptionIndexes[x]].content.trigger("onOpen");
				for(var n=0; n<settings.navigations.length; n++) dataArray[exceptionIndexes[x]].nav[n].addClass(settings.navigationActivedClass);
			}
		}
		
		return this;
	};
	

	/**
	 * defaults - public object to overwrite options
	 * @example 
	 */
	$.fn.toggleManager.defaults = {
		onOpen: function(event){ $(event.target).show();},
		onClose: function(event){ $(event.target).hide();},
		singleContent: true,
		navigationActivedClass: "activated",
		navigations: Array(),
		defaultOpenedContent: null
	};
	
})(jQuery);