/**
 * jQuery Sabramedia Plugin - Function for Sabramedia Virtual Office System
 * Copyright (C) 2008 Sabramedia, LLC
 * http://www.sabramedia.com
 *
 * @author Nick Johnson {@link http://www.nickjohnson.com}
 */
(function ($)
{
	var sabramediaSpinnerSmall = '<span id="pending"><img src=\"/admin/theme/default/img/spinner-small.gif\" /></span>';
	// Note: Reference to an outside spinner image is set, may need to change based on
	// what system this file is called from.
	
	
	$.fn.listCollapser = function()
	{
		$('li:has(ul)',this).children('ul').hide().end()
		.find(':first').click(function(event){
			if(event.target){
				if($(this).parent().children('ul').is(':hidden')){
					$(this)
						.parent().children('ul').slideToggle('normal');
				}else{
					$(this)
						.parent().children('ul').slideToggle('normal');
				}
			}
			return false;
		});
	};
	
	// This works on <ul> tags with indefinite children 
	$.fn.navigationMenu = function()
	{		
		var navigation = $(this);
		$('li:has(ul)',this).children('ul').hide().end()
			.each(function(i){
				$(this).mouseover(function(event){
					if(event.target){
						var menu;
						menu = $(this).children('ul');
						if($(menu).is(':hidden')){
						//$('span#test').text(i);
							$(menu).slideDown('normal');
							menuHandler(menu);
						}
					}
				});
			});
				
		function menuHandler(menu)
		{
			var timerID = 0;
			$(menu).parent().hover(function(event){
				if(timerID){ clearTimeout(timerID) };
				timerID  = 0;
			},
			function(){
				timerID = setTimeout(function(){$(menu).slideUp('normal')},400);
			});
		};
	};
	
	// Ajax event handler for submiting input fields with in a set of <li> or <tr> tags 
	$.fn.setListFieldEvents = function(callerSettings)
	{
		var settings = $.extend({
			actionAddPath: false,
			actionUpdatePath: false,
			actionDeletePath: false
		}, callerSettings || {});
		
		// Hide all parent format containers
		$('.sibling-format').hide();
		var parentContainer = $(this);
		
		if(settings.actionAddPath){		
			$('.key-enter-add',this).ajaxEventHandler({
					inputParent:parentContainer,
					eventType:'keyup',
					keyCode:13,
					actionController: settings.actionAddPath,
					success:[successAdd]
				});
		}
		
		if(settings.actionUpdatePath){
			$('.key-enter-update',parentContainer).ajaxEventHandler({
					inputParent:parentContainer,
					eventType:'keyup',
					keyCode:13,
					actionController: settings.actionUpdatePath
				});
				
			$('.keyup-update',parentContainer).ajaxEventHandler({
					inputParent:parentContainer,
					eventType:'keyup',
					actionController: settings.actionUpdatePath
				});
		}
		
		if(settings.actionDeletePath){
			$('.click-delete',parentContainer).ajaxEventHandler({
					inputParent:parentContainer,
					eventType:'click',
					actionController: settings.actionDeletePath,
					verifyAction: 'Are you sure you want to delete this?',
					success:[function(data, status){
							// Change class name so that the .click-delete class does not get re-enabled.
							$('.click-delete',parentContainer).attr('class','click-delete-remove');
							
							$(parentContainer).fadeOut('normal',function(){
								$(parentContainer).remove();
							});
						}]
				});
		}
			
		// Custom success function for adding
		function successAdd(event,xhr,ajaxOptions)
		{
			var newId = event.returnedData.new_id;
			var $clonedCopy = $(event).parent().clone();
			
			$clonedCopy
				.removeClass()
				.attr('data-json','{id:'+newId+'}')
				.removeAttr('style')
				.find('.click-delete')
					.show()
					.removeAttr('disabled')
				.end()
				.find('.key-enter-add')
					.removeClass()
					.addClass('key-enter-update')
				.end();
				
			$(event).parent().hide('normal',function(){
				$clonedCopy.hide();
				$(this).after($clonedCopy);
				$clonedCopy.slideDown();
			}).children('.key-enter-add').val('');
		};

		$(this).children().each(function(i){
			if(i==0){
				$('.click-delete',this).hide();
				$(parentContainer).siblings('.click-add').click(function(){
					$('.sibling-format',parentContainer).slideToggle('normal');
				});
			}
		});
		
		$(parentContainer).parent().children('.click-add').click(function(){
			$(parentContainer).children('.parent-format').show('normal');
		});
		
		function checkULContent(parentContainer)
		{
			if($(parentContainer).children().length == 0){
				$(parentContainer).append('<li>No data here.</li>').hide().slideDown('normal');
			}
		};
	};
	/**
		Default: Assume that the event handler is a parent tag with children input tags.<b>
		If dataObject is set from outside, then only send that and don't run data row functions 
	*/
	
	$.fn.ajaxEventHandler = function(callerSettings)
	{
		var settings = $.extend({
			eventType: '',
			keyCode: null,
			inputParent: null,
			dataObject: null,
			actionController: '/action/public/404-json.php',
			verifyAction: false,
			beforeSend: null,
			waiting: null,
			success: null,
			complete: null
		}, callerSettings || {});
		
		//alert(settings.actionController);
		
		$(this).livequery(settings.eventType,function(event){
			var verify;
			if(!settings.verifyAction){
				verify = true;
			}else{
				verify = confirm(settings.verifyAction);
			}
			
			if(verify){
				// If a keyCode is set, then we want to check which one before executing the ajaxCall()
				if(settings.keyCode){
					// On keyup from the 'enter' key code which is 13
					if(event.keyCode == settings.keyCode){
						$(this).ajaxCall({
							actionController:settings.actionController,
							inputParent:settings.inputParent,
							dataObject:settings.dataObject,
							beforeSend:settings.beforeSend,
							success:settings.success,
							complete:settings.complete
						});
					}else{
						$(this).parent().css('background-color','red');
					}
				}else{
					$(this).ajaxCall({
						actionController:settings.actionController,
						inputParent:settings.inputParent,
						dataObject:settings.dataObject,
						beforeSend:settings.beforeSend,
						success:settings.success,
						complete:settings.complete
					});
				}
			}
		});
		
		$.fn.ajaxCall = function(callerSettings)
		{
			var settings = $.extend({
				inputParent: null,
				dataObject: null,
				actionController: '/action/public/404-json.php',
				beforeSend:null,
				success:null,
				complete:null
			}, callerSettings || {});
			
			// if tinyMCE variable set then we need to trigger the new values.
			if(typeof(tinyMCE) != 'undefined'){
				tinyMCE.triggerSave();
			}
			if(typeof(editAreaLoader) != 'undefined'){
				$('textarea#content-js').append(editAreaLoader.getValue('content-js'));
			}
			
			// If dataObject is passed, send as Ajax data
			var thisUpdateField = $(this);
			var serializedData = '';
			
			if(settings.dataObject){
				serializedData = settings.dataObject;
			}else{
				serializedData = $(settings.inputParent).serializeRowData();
			}
			
			function beforeSend(xhr)
			{
				$(thisUpdateField).after(sabramediaSpinnerSmall);
				
				// Disable all sibling fields only dataObject is not passed and rowData is used
				$(thisUpdateField).siblings().andSelf().attr('disabled','disabled');
				
				var object = this;
				// Iterate through custom fields
				if(settings.beforeSend){
					$.each(settings.beforeSend,function(i,customFunction){
						// Pass field object of event handler
						customFunction(object);
					});
				}
			};
			
			
			function success(data,status)
			{
				$('#pending').remove();
				if(settings.success){
					$.each(settings.success,function(i,customFunction){
						// Pass field object of event handler
						customFunction(data,status,thisUpdateField);
					});
				}else{
					$(thisUpdateField)
						.focus()
						.siblings('.temp-message').remove().end()
						.parent('li').removeAttr('style').end()
						.after('<span class=\"temp-message\">'+data.message+'</span>');
				}
				
				messageHandler(data);
			};
			
			function complete()
			{
				// Re-enable disabled fields upon success
				$(thisUpdateField).siblings().andSelf().removeAttr('disabled');
				if(settings.complete){
					$.each(settings.complete,function(i,customFunction){
						// Pass field object of event handler
						customFunction(event,xhr,ajaxOptions);
					});
				}
			};
			
			// Ajax intializes here
			$.ajax({
				type:'POST',
				url:settings.actionController,
				dataType:'json',
				data:serializedData,
				beforeSend:beforeSend,
				success:success,
				complete:complete
			});
				
			return this;
		};
		
		/**
		* serializeJSON()
		* Turns JSON object into a serialized string in the form of: key=val&key2=val2 
		*
		* @param object literal object
		* @return string serialized for Ajax
		*/
		function serializeJSON(dataObject)
		{
			var dataArray = [];
			var retval;
			
			$.each(dataObject,function(key,data){
				dataArray.push(key + '=' + escape(data));
			});
			
			retval = dataArray.join('&');
			return retval;
		};
		
		function simplifyInputData(dataObject)
		{
			var object = [];
			var retval;
			
			$.each(dataObject,function(key,data){
				
				object[data.name] = data.value;
			});
			
			retval = object;
			return retval;
		};
		
		/** 
		* serializeRowData()
		* Accesses this elements parent element data-json attribute and all sibling element form-type
		* fields, then serializes data for sending via Ajax XHR.<b>
		*
		* @return string serialized data to send via Ajax 
		*/
		$.fn.serializeRowData = function()
		{
			//alert($(this).html());
			// Gets all json data contained in the parent tag's data-json wrapper 
				$.metadata.setType('attr','data-json');
			var jsonObject = $('[data-json]',this).andSelf().metadata();
			// Gets all form type fields based on the current field's containing parent,
			// Then it serializes the data for passing to the ajax controller.
			var inputData = $(this).find(':input');
			// Concatentate the jsonData and the inputData
			var serialData = serializeJSON(jsonObject)+'&'+inputData.serialize();
			//return jsonData;
			// Optional dual-type data object
			return serialData;
		};
		
		function messageHandler(data)
		{
			$("#dock-container").hide();
			$("#dock-container #ajax-message").empty().append(data.message);
			$("#dock-container").fadeIn('normal');
			setTimeout("$('#dock-container').fadeOut('slow')",4000);
		};
		return this;
	};
	
	
	
	// Ajax File upload plugin using iframe
	$.extend({
	
		queryToArray: function(string)
		{
			var r = {};
			var params = string.split('&');
			for( var i = params.length-1;  i >= 0;  i-- ) {
			   var p = params[i].split('='), key = p[0];
			   if( key ) r[key] = p[1];
			}
			return r;
		},
		
		addCommas : function(nStr)
		{
			nStr += '';
			x = nStr.split('.');
			x1 = x[0];
			x2 = x.length > 1 ? '.' + x[1] : '';
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(x1)) {
				x1 = x1.replace(rgx, '$1' + ',' + '$2');
			}
			return x1 + x2;
		},
	
	    createUploadIframe: function(id, uri)
		{
				//create frame
	            var frameId = 'jUploadFrame' + id;
	            
	            if(window.ActiveXObject) {
	                var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
	                if(typeof uri == 'boolean'){
	                    io.src = 'javascript:false';
	                }else if(typeof uri == 'string'){
	                    io.src = uri;
	                }
	            }else{
	                var io	= document.createElement('iframe');
	                io.id	= frameId;
	                io.name	= frameId;
	            }
	            io.style.position	= 'absolute';
	            io.style.top		= '-1000px';
	            io.style.left		= '-1000px';
	
	            document.body.appendChild(io);
	
	            return io			
	    },
	    
	    createUploadForm: function(id, fileElementId)
		{
			//create form	
			var formId = 'jUploadForm' + id;
			var fileId = 'jUploadFile' + id;
			var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');	
			var oldElement = $('#' + fileElementId);
			var newElement = $(oldElement).clone();
			$(oldElement).attr('id', fileId);
			$(oldElement).before(newElement);
			$(oldElement).appendTo(form);
			//set attributes
			$(form).css('position', 'absolute');
			$(form).css('top', '-1200px');
			$(form).css('left', '-1200px');
			$(form).appendTo('body');
					
			return form;
	    },
	
	    ajaxFileUpload: function(s) {
	        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout		
	        s = jQuery.extend({}, jQuery.ajaxSettings, s);
	        var id = new Date().getTime()        
			var form = jQuery.createUploadForm(id, s.fileElementId);
			var io = jQuery.createUploadIframe(id, s.secureuri);
			var frameId = 'jUploadFrame' + id;
			var formId = 'jUploadForm' + id;		
	        // Watch for a new set of requests
	        if ( s.global && ! jQuery.active++ ){
				jQuery.event.trigger( "ajaxStart" );
			} 
	        var requestDone = false;
	        // Create the request object
	        var xml = {}   
	        if ( s.global ){
	            jQuery.event.trigger("ajaxSend", [xml, s]);
	        }
	        // Wait for a response to come back
	        var uploadCallback = function(isTimeout)
			{			
				var io = document.getElementById(frameId);
	            try {				
					if(io.contentWindow){
						xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
	                	xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;					 
					}else if(io.contentDocument){
						xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
	                	xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
					}
	            }catch(e){
					jQuery.handleError(s, xml, null, e);
				}
	            if ( xml || isTimeout == "timeout") {			
	                requestDone = true;
	                var status;
	                try {
	                    status = isTimeout != "timeout" ? "success" : "error";
	                    // Make sure that the request was successful or notmodified
	                    if ( status != "error" ){
	                        // process the data (runs the xml through httpData regardless of callback)
	                        var data = jQuery.uploadHttpData( xml, s.dataType );    
	                        // If a local callback was specified, fire it and pass it the data
	                        if ( s.success ){
	                            s.success( data, status );
	                        }
	    
	                        // Fire the global callback
	                        if( s.global ){
	                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
	                        }
	                    } else{
	                    	jQuery.handleError(s, xml, status);
	                    }
	                } catch(e){
	                    status = "error";
	                    jQuery.handleError(s, xml, status, e);
	                }
	
	                // The request was completed
	                if( s.global ){
	                    jQuery.event.trigger( "ajaxComplete", [xml, s] );
	                }
	
	                // Handle the global AJAX counter
	                if ( s.global && ! --jQuery.active ){
	                    jQuery.event.trigger( "ajaxStop" );
	                }
	
	                // Process result
	                if ( s.complete ){
	                    s.complete(xml, status);
	                }
	
	                jQuery(io).unbind();
	
	                setTimeout(function()
										{	try {
												$(io).remove();
												$(form).remove();	
												
											} catch(e) {
												jQuery.handleError(s, xml, null, e);
											}							
	
										}, 100);
	                xml = null;
	
	            }
	        }
	        // Timeout checker
	        if ( s.timeout > 0 ){
	            setTimeout(function(){
	                // Check to see if the request is still happening
	                if( !requestDone ) uploadCallback( "timeout" );
	            }, s.timeout);
	        }
	        try{
	           // var io = $('#' + frameId);
				var form = $('#' + formId);
				$(form).attr('action', s.url);
				$(form).attr('method', 'POST');
				$(form).attr('target', frameId);
	            if(form.encoding){
	                form.encoding = 'multipart/form-data';				
	            }else{				
	                form.enctype = 'multipart/form-data';
	            }			
	            $(form).submit();
	
	        } catch(e) {			
	            jQuery.handleError(s, xml, null, e);
	        }
	        if(window.attachEvent){
	            document.getElementById(frameId).attachEvent('onload', uploadCallback);
	        }else{
	            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
	        }
	        return {abort: function () {}};	
	
	    },
	
	    uploadHttpData: function( r, type )
	    {
	        var data = !type;
	        data = type == "xml" || data ? r.responseXML : r.responseText;
	        // If the type is "script", eval it in global context
	        if ( type == "script" ){
	            jQuery.globalEval( data );
	        }
	        // Get the JavaScript object, if JSON is used.
	        if ( type == "json" ){
	            eval( "data = " + data );
	        }
	        // evaluate scripts within html
	        if ( type == "html" ){
	            jQuery("<div>").html(data).evalScripts();
	        }
				//alert($('param', data).each(function(){alert($(this).attr('value'));}));
	        return data;
	    },

	// Page overlay function
	// Plugin dependency: dimensions
	    pageOverlay: function( callerSettings ){
	    
	    	var settings = $.extend({
				boxLoader: function(){ return null; }
			}, callerSettings || {});
			
			var popBox = '#pop-box';
			
	    	settings.boxLoader();
	    	
	   		var closeButton = $('.pop-close').clone();
	    	$(closeButton).bind('click',function(){
	    		$.pageOverlay().close('.pop');
	    	});
	    	
	    	$('#mask').removeClass('hide');
	    	$('body').removeClass('masked');
	    	// For some reason clicking the mask in ie sends it into a crashing loop
	    	// Don't add this if ie browser is used.
	    	if(!$.browser.msie){
		    	$('div#mask').bind('click',function(){
		    		$.pageOverlay().close('.pop');
		    	});
	    	}
		    	
	    	this.show = function(html)
	    	{
	    		var popBoxContent;
	    		popBoxContent = html ? html : 'Need to insert something here';
	    		
	    		if(typeof(html) == 'string'){
	    			// Woule prefer to use the following: 
	    			// popBoxContent = $('#pop-boxes ' + html).clone();
	    			// But IE doesn't like it
	    			// Refer to:  http://dev.jquery.com/changeset/4513 OR http://dev.jquery.com/ticket/3289
	    			popBoxContent = $('#pop-boxes ' + html).html();
	    		}
				
				
	    		$(popBox).empty().append(closeButton).append(popBoxContent);
	    		$('select :not('+popBox+')').css('visibility', 'hidden');
	    		$('object :not('+popBox+')').css('visibility', 'hidden');
	    		$('embed :not('+popBox+')').css('visibility', 'hidden');
				$('body').addClass('masked');
				
				$('#mask').css({
					'height':$(document).height()+'px',
					'width':$(document).width()+'px'
				}).removeClass('hide');
				
				$(popBox).removeClass('hide');
				
				var popBoxHeight = $(popBox).height();
				var popBoxWidth = $(popBox).width();
				
				$(window).bind('load scroll resize',function(){
					var verticalCenterTop = Math.round(($(window).innerHeight() - popBoxHeight) / 2);
						if(verticalCenterTop < 0){ verticalCenterTop = 0; }
					var horizontalCenterTop = Math.round(($(window).innerWidth() - popBoxWidth) / 2);
						if(horizontalCenterTop < 0){ horizontalCenterTop = 0; }
					
					$(popBox).css({
						'top':verticalCenterTop + $(window).scrollTop(),
						'left':horizontalCenterTop + $(window).scrollLeft()
					});
				});
				
				$(window).trigger('load');
				
	    		$('#mask').fadeIn('400',function(){
	    			$(popBox).fadeIn('300');
	    		});
	    	};
	    	
	    	this.close = function()
	    	{				
	    		$(popBox).hide();
	    		$('#mask').fadeOut();
	    		
				//$('body').removeClass('masked');
	    		$('embed :not('+popBox+')').css('visibility', 'visible');
	    		$('object :not('+popBox+')').css('visibility', 'visible');
	    		$('select :not('+popBox+')').css('visibility', 'visible');
	    	};
	    	
	    	return this;
	    }
	});
	
	$.fn.setAddressDisplay = function(addressObject)
	{
		$(this).attr('data-json',$.toJSON(addressObject));
		$('.full-name',this).text(addressObject.full_name);
		$('.address1',this).text(addressObject.address1);
		$('.address2',this).text(addressObject.address2);
		$('.city',this).text(addressObject.city);
		$('.state',this).text(addressObject.state);
		$('.zip',this).text(addressObject.zip);
		$('.phone',this).text(addressObject.phone);
		
		if(!addressObject.default_billing && !addressObject.default_shipping){
			$('.address_type',this).remove();
		}else{
			if(addressObject.default_billing && addressObject.default_shipping){
				$('.address_type',this).html('Billing &amp; Shipping')
			}else{
				addressObject.default_billing ? $('.address_type',this).html('Billing') : '';
				addressObject.default_shipping ? $('.address_type',this).html('Shipping') : '';
			}
		}
		
		//$(this).show();
		return this;
	};
	
	$.fn.setRSSItemDisplay = function(jsonObject)
	{
		$('.title',this).text(jsonObject.title[0].Text);
		$('.link',this).attr('href',jsonObject.link[0].Text);
		$('.description',this).text(jsonObject.description[0].Text);
		
		//$(this).show();
		return this;
	};
	
	$.fn.setRSSChannelDisplay = function(jsonObject)
	{
		$('.title',this).text(jsonObject.title[0].Text);
		$('.link',this).attr('href',jsonObject.link[0].Text);
		$('.description',this).text(jsonObject.description[0].Text);
		//$('.image',this).attr('src',jsonObject.image[0].url[0].Text);
		
		//$(this).show();
		return this;
	};
	
	// Depends on jquery.XMLUtils.pack.js
	$.fn.XMLReader = function(callerSettings)
	{
		var settings = $.extend({
			feed: false,
			sortName: 'title',
			sortOrder: 'ASC'
		}, callerSettings || {});
		
		var object = this;
		var feed = settings.feed ? settings.feed : $(this).attr('data-feed');
		
		$.ajax({
			type: 'POST',
			url: 'xml',
			data:{feed:feed},
			dataType: 'xml', //Make sure that you specify the type of file you expecting (XML)
			complete: function(data) {
				// Grab the display template
				var feedChannelTemplate = $('.rss-channel',object).remove();
				var feedItemTemplate = $('.rss-items .template',object).remove();
				var json = $.xmlToJSON(data.responseXML); //Please notice that we use responseXML here which is DOMDocument object
				
				$(object).prepend($(feedChannelTemplate).setRSSChannelDisplay(json.channel[0]));
				
				// Now I want to sort all item nodes by their value
				json.channel[0].item.SortByNode(settings.sortName,settings.sortOrder); //Default order is ASC
				for(var i = 0; i < json.channel[0].item.length; i++) {
					var newList = $(feedItemTemplate).clone();
					$('.rss-items', object).append($(newList).setRSSItemDisplay(json.channel[0].item[i]));
				}
			}
		});
	};
	
	$.fn.setAddressForm = function(addressObject)
	{
		$(this).attr('data-json','{id:' + addressObject.id + '}');
		$('input[name=full_name]',this).val(addressObject.full_name);
		$('input[name=address1]',this).val(addressObject.address1);
		$('input[name=address2]',this).val(addressObject.address2);
		$('input[name=city]',this).val(addressObject.city);
		$('input[name=state]',this).val(addressObject.state);
		$('input[name=zip]',this).val(addressObject.zip);
		$('input[name=phone]',this).val(addressObject.phone);
		
		addressObject.default_billing ? $('input[name=type_billing]').attr('checked','checked') : $('input[name=type_billing]').attr('checked','');
		addressObject.default_shipping ? $('input[name=type_shipping]').attr('checked','checked') : $('input[name=type_shipping]').attr('checked','');
		
		//addressObject.default_billing ? $('input[name=phone]',this)
		
		return this;
	};
	
	// Start form setup and validation
		$.fn.checkWarnings = function( buttonValue )
		{
			buttonValue = buttonValue ? buttonValue : 'Next Step >';
			
			var numWarnings = $('.warning').length;
			if(numWarnings > 0){
				$('.submit',this).attr('disabled','disabled').val('Fill in required fields');
			}else{
				$('.submit',this).removeAttr('disabled').val(buttonValue);
			}
		};
	
		$.fn.setFormValidation = function( buttonValue )
		{
			var requiredFlag = '<span class="required-flag">*</span>';
			$('.required-flag',this).remove();
		
			$(':input',this).filter('.required')
			.prev('label').addClass('required')
			.append(requiredFlag)
			.parents('li').addClass('warning');
			
			$(this).checkWarnings(buttonValue);
		
			$(':input:visible',this).each(setRequired).bind('keyup change',setRequired);
			
			function setRequired()
			{
				if($(this).is('.required')){
					if($(this).val()){
						$(this).parents('li:first').removeClass('warning');
					}else{
						$(this).parents('li:first').addClass('warning');
					}
					$(this).parents('form').checkWarnings(buttonValue);
				}
			};
		};
		
		
})(jQuery);

// END OF PLUGINS

// Body stuff

/*
Example DOM:
<ul id="n1">
	<li>Level 1
		<ul>
			<li>Level 2</li>
			<li>Level 2</li>
		</ul>
	</li>
	<li>Level 1</li>
</ul>

*/

$(document).ready(function(){
		
$("#main-navigation").navigationMenu();
	var nav1 = $('.dropdowns');
	var nav2 = $('li ul',nav1);

	function nav(level)
	{
		var nextLevel = $('li ul',level);
		$(nextLevel).hide()
			.siblings('a').addClass('button').removeAttr('href')
			.mouseover(function(){
				//$(nextLevel).not(':hidden').hide('slow');

				if($(this).siblings('ul').is(':hidden')){
					$(nextLevel).siblings('a').removeClass('buttonOver');
					$(this).addClass('buttonOver');

					$(nextLevel).slideUp('slow');
					$(this).siblings('ul').slideDown('slow');
				}else{
					$(nextLevel).siblings('a').removeClass('buttonOver');
					$(this).siblings('ul').slideUp('slow');
				}
			});
	}
	//nav(nav1);
	
	
	
// Forms
	$('label.hint').each(function(){
		var labelText	= $(this).remove().text();
		var forField	= $(this).attr("for");
		var input		= $("input[name='"+forField+"']");
		if(!input.val()){
			$(input).addClass('placeholder').val(labelText).focus(function(){
				if(this.value == labelText){
					$(this).removeClass('placeholder').val('');
				};
			}).blur(function(){
				if(this.value == ''){
					$(this).addClass('placeholder').val(labelText);
				};
			});
		}
	});
});



function dump (obj, dep) {
	var r   = '';
	var dep = (typeof(dep) == 'number') ? ++dep : 0;
	var ind = '';
	
	for (var i = 0; i < dep; i++) { ind += '\t'; }
	for (var i in obj) {
		var is_obj = (typeof(obj[i]) == 'object');
		
		r += ind + '[' + i + '] : ';
		r += !is_obj ? obj[i] : '';
		r += '\n';
		r += is_obj ? arguments.callee(obj[i], dep) : '';
	}
	
	return r;
}

