/*------------------------------------------------------------------------------

	Filename             thunder.client.js
	Detail               Standard process library
	Author:              thunder::tech inc.
	License:             CLIENT is defined as the owner of online property from which this file resides or this code is referenced in.
						 ADDITIONAL PARTY is defined as anyone other than thunder::tech or CLIENT.
						 No right is granted to CLIENT or ADDITIONAL PARTY to sell, distribute, modify or otherwise transfer the following source code without explicit written permission by thunder::tech.

------------------------------------------------------------------------------*/

var thunder = { client: { project: { utils: {} }, modify: {}, checks: {}, workarounds: {} } };

/*------------------------------------------------------------------------------

	thunder.client.modify
	Create dynamic interactivity by modifying existing markup

	Each method is documented using the following terms.
	hook: JQuery/CSS hook that activates the functionality on an element
	output: The change that the functionality results in; almost always in the form of a JQuery/CSS hook change

------------------------------------------------------------------------------*/

	// method thunder.client.modify.selfLabelFields()
	// hook: .thunder-self-labeled
	// uses existing value attribute as label
	// sets thunder.markup:label attribute
	// output: toggling .thunder-label-cleared
	thunder.client.modify.selfLabelFields = function()
	{
		// Auto-label search field
		$(".thunder-self-labeled").each(function(i)
		{
			this.setAttribute('thunder.markup:label',this.value)
		}).focus(function()
		{
			if(this.value==this.getAttribute('thunder.markup:label'))
			{
				this.value='';
				$(this).addClass('thunder-label-cleared');
			}
		}).blur(function()
		{
			if(this.value=='')
			{
				this.value=this.getAttribute('thunder.markup:label');
				$(this).removeClass('thunder-label-cleared');
			}
		});	
	};

	// method thunder.client.modify.knapikMenu()
	// parameter wl:Boolean ? hide window layer objects when menu is active?
	// hook: .thunder-tree-menu
	// output: toggling .thunder-nav-on
	thunder.client.modify.treeMenu = function(wl)
	{
		$('.thunder-tree-menu').find('li').mouseenter(function()
		{
			$(this).addClass('thunder-nav-on');
		}).mouseleave(function()
		{
			$(this).removeClass('thunder-nav-on');
		});
		if(wl)
		{
			$('.thunder-tree-menu').mouseenter(function()
			{
				thunder.client.workarounds.windowLayer(false);
			}).mouseleave(function()
			{
				thunder.client.workarounds.windowLayer(true);
			});
		}
	};

	// method thunder.client.modify.tabSet()
	// hooks: .thunder-tab, .thunder-tab-window
	// correlator: (tab) thunder.markup:item="css-hook" e.g. #this-tab-window or .these-tab-windows
	// output: toggling .thunder-tab-on, .thunder-tab-window-on
	// parameters: c:Function; callback(s) where s:String is thunder.markup:item
	thunder.client.modify.tabSet = function(c)
	{
		$('.thunder-tab').click(function()
		{
			$('.thunder-tab').removeClass('thunder-tab-on');
			$('.thunder-tab-window').removeClass('thunder-tab-window-on');
			$(this).addClass('thunder-tab-on');
			$(this.getAttribute('thunder.markup:item')).addClass('thunder-tab-window-on');
			if(c) c(this.getAttribute('thunder.markup:item'));
		});
	}
	
	// method thunder.client.modify.linkOptions()
	// hook: .thunder-link-options
	// output: changes window.location to value attribute
	thunder.client.modify.linkOptions = function()
	{
		$('.thunder-link-options').change(function()
		{
			var u, i;
			for(i=0;i<this.options.length;i++)
			{
				if(this.options[i].selected==true) window.location = this.options[i].value;
			}
		});
	}

	// method thunder.client.modify.rollImages()
	// hook: .thunder-roll-over
	// output: modifies src to and and remove -over from .jpg, .gif, .png
	thunder.client.modify.rollImages = function()
	{
		$('.thunder-roll-over').mouseenter(function()
		{
			var i;
			i = this.src;
			i = i.replace('.jpg', '-over.jpg');
			i = i.replace('.gif', '-over.gif');
			i = i.replace('.png', '-over.png');
			this.src = i;
		}).mouseleave(function()
		{
			var i;
			i = this.src;
			i = i.replace('-over.jpg', '.jpg');
			i = i.replace('-over.gif', '.gif');
			i = i.replace('-over.png', '.png');
			this.src = i;
		});
	};

	// method thunder.client.modify.requireFields()
	// hooks: .thunder-required, .thunder-requiree
	// output: modifies the requiree's disabled property
	//			adds .thunder-requiree-met, .thunder-required-met when requirements met
	thunder.client.modify.requireFields = function()
	{
		var requireChecker = function()
		{
			var disableRequirees = false;
			$('.thunder-required').each(function()
			{
				if(thunder.client.checks.selfLabelFilled(this)==false)
				{
					disableRequirees = true;
					$(this).removeClass('thunder-required-met');
				}
				else
				{
					$(this).addClass('thunder-required-met');
				}
			});
			$('.thunder-requiree').each(function()
			{
				if(disableRequirees==true)
				{
					$(this).removeClass('thunder-requiree-met');
				}
				else
				{
					$(this).addClass('thunder-requiree-met');
				}
				this.disabled = disableRequirees;
			});
		};
		requireChecker();
		$('.thunder-required').change(requireChecker);
		$('.thunder-required').keypress(requireChecker);
	};

/*------------------------------------------------------------------------------

	thunder.client.checks
	Boolean conditional functions

------------------------------------------------------------------------------*/

	// method thunder.client.checks.selfLabelFilled(field):Boolean
	// works on both self-labeled via this script and non-self-labeled fields
	// returns: true if filled, false if empty
	thunder.client.checks.selfLabelFilled = function(field)
	{
		if(field.value===''||field.value==field.getAttribute('thunder.markup:label'))
		{
			return false;
		}
		else
		{
			return true;
		}
	}

/*------------------------------------------------------------------------------

	thunder.client.workarounds
	Browser-specific workarounds

------------------------------------------------------------------------------*/

	// is IE 6?
	thunder.client.workarounds.isIE6 = $.browser.msie && $.browser.version=="6.0";

	// method thunder.client.workarounds.windowLayer
	// b:Booolean ? show window layer objects : hide them
	thunder.client.workarounds.windowLayer = function(b)
	{
		if(thunder.client.workarounds.isIE6)
		{
			if(b==true)
			{
				$(document).find('select').css('visibility', 'visible');
			}
			else
			{
				$(document).find('select').css('visibility', 'hidden');
			}
		}
	}

	// method thunder.client.workarounds.alphaImages
	// replaces .png in image sources and background images with .gif
	thunder.client.workarounds.alphaImages = function(b)
	{
		if(thunder.client.workarounds.isIE6)
		{
			$(document).find('img').each(function(elementIndex, elementObject)
			{
				var elementSrc;
				elementSrc = elementObject.src;
				elementSrc = elementSrc.replace('.png', '.gif');
				elementObject.src = elementSrc;
				return true;
			});
			$(document).find('*').each(function(elementIndex, elementObject)
			{
				var elementBgi;
				elementBgi = $(elementObject).css('background-image');
				elementBgi = elementBgi.replace('.png', '.gif');
				$(elementObject).css('background-image', elementBgi)
				return true;
			});
		}
	}
