var XPE = {
	// common functions
	replaceContent : function ( placeholderSelector, content ){
				jQuery( placeholderSelector ).removeClass( 'loading' ).replaceWith( innerShiv(content) );
			},

	addCSSRule : function( selector, cssRule ){
				var styleSheets = document.styleSheets[0];

				if( styleSheets.insertRule ){
					// real browsers
					styleSheets.insertRule( selector + '{' + cssRule + '}', styleSheets.cssRules.length );
				} else {
					// IE
					styleSheets.addRule( selector, cssRule );
				}
			},

	// main functions
	makeExpandable : function( callerSelector, parentSelector, subitemsSelector, hideOtherElements ){
			function expand( e ){
				var parentElement = jQuery( this ).parents( e.data.parentSelector );
				var subitems = jQuery( e.data.subitemsSelector, parentElement );

				if( hideOtherElements ){
					jQuery( '.expand ' + e.data.subitemsSelector, parentElement.parent() ).slideToggle();
					jQuery( '.expand', parentElement.parent() ).toggleClass( 'expand' );
				}

				parentElement.toggleClass( 'expand' );
				subitems.slideToggle();

				if( jQuery( this ).is( 'a' ) ) {
					e.preventDefault();
				}
			}

			jQuery( callerSelector ).live( 'click', { parentSelector : parentSelector, subitemsSelector : subitemsSelector }, expand );
		},

	ajaxifyForm : function( callerSelector, placeholderSelector, closestSelector ){
			function submitActivated(){
				$( this.form ).data( 'submitActivated', { name: this.name, value: this.value } );
			}

			jQuery( callerSelector + ' *[type="submit"], ' + callerSelector + ' *[type="image"]' ).live( 'click', submitActivated );

			function ajaxForm( e ){
				var placeholder,
				    data,
				    submit = $( this ).data( 'submitActivated' );

				if ( closestSelector ){
					placeholder = jQuery( this ).closest( closestSelector );
				} else {
					placeholder = jQuery( placeholderSelector );
				}

				placeholder.addClass( 'loading' );

				data = jQuery( this ).serialize() + '&AJAXLoad=' + placeholderSelector;

				if ( submit ){
					data += '&' + submit.name + '=' + submit.value;
				}

				jQuery.ajax( {
					url : jQuery( this ).attr( 'action' ),
					type : jQuery( this ).attr( 'method' ),
					data : data,
					success : function( text ){
							XPE.replaceContent( placeholder, text );
						}
					} );

				e.preventDefault();
			}

			jQuery( callerSelector ).live( 'submit', ajaxForm );
		},
		
	ajaxifyInput : function(callerSelector, placeholderSelector, url ){
			function ajaxInput( e ){
				e.preventDefault();

				jQuery( placeholderSelector ).addClass( 'loading' );

				jQuery.ajax( {
					url : url,
					type : 'get',
					data : jQuery( this ).serialize() + '&AJAXLoad=' + placeholderSelector, 
					success : function( text ){
							XPE.replaceContent( placeholderSelector, text );
						}
					} );
			}

			jQuery( callerSelector ).live( 'keyup', ajaxInput );
		},	

		
	ajaxifySelect : function(callerSelector, placeholderSelector, url ){
			function ajaxSelect( e ){
				e.preventDefault();

				jQuery( placeholderSelector ).addClass( 'loading' );

				jQuery.ajax( {
					url : url,
					type : 'get',
					data : jQuery( this ).serialize() + '&AJAXLoad=' + placeholderSelector, 
					success : function( text ){
							XPE.replaceContent( placeholderSelector, text );
						}
					} );
			}

			jQuery( callerSelector ).live( 'change', ajaxSelect );
		},	

	ajaxifyLink : function( callerSelector, placeholderSelector, closestSelector ){
			function ajaxLink( e ){
				var placeholder;

				if ( closestSelector ){
					placeholder = jQuery( this ).closest( closestSelector );
				} else {
					placeholder = jQuery( placeholderSelector );
				}

				placeholder.addClass( 'loading' );

				jQuery.get( this.href, { AJAXLoad : placeholderSelector }, function( text ){
						XPE.replaceContent( placeholder, text );
					} );

				e.preventDefault();
			}

			jQuery( callerSelector ).live( 'click', ajaxLink );
		},

	customizeInputs : function( inputSelector, parentSelector ){
			function customInputClicked( e ){
				if( jQuery( this ).is( 'input[type=radio]' ) ) {
					jQuery( 'input[name=' + this.name + ']' ).parents( e.data.parentSelector ).removeClass( 'checked' );
					jQuery( this ).parents( e.data.parentSelector ).addClass( 'checked' );
				}
				if ( jQuery( this ).is( 'input[type=checkbox]' ) ) {
					jQuery( this ).parents( e.data.parentSelector ).toggleClass( 'checked' );
				}
			}

			jQuery( inputSelector ).live( 'click', { parentSelector : parentSelector }, customInputClicked );
		},

	ajaxMarkCurrent : function( parentSelector, elementToMark ){
			function markCurrent( e ){
				jQuery( e.data.parentSelector + ' .current' ).removeClass( 'current' );
				jQuery( this ).addClass( 'current' );
			}

			jQuery( parentSelector + ' ' + elementToMark ).live( 'click',{ parentSelector : parentSelector, elementToMark : elementToMark }, markCurrent );
		},

	overlayCloseBtn : function( overlayPlaceholderSelector, overlayCloseButtonSelector ){
			jQuery( overlayCloseButtonSelector ).live( 'click', function( e ){
					e.preventDefault();
					jQuery( overlayPlaceholderSelector ).html( '' );
				} );
		},

	fixIEImageClick : function(){
			jQuery( 'label img' ).live( 'click', function(){
					jQuery( 'input', this.parentNode ).click();
				} );
		},
		
	
	addAjaxIndicator : function( indicatorElement ){
		jQuery( '#loadingLayer' ).ajaxStart( function(){
				jQuery( this ).css( 'visibility', 'visible' );
			} );

		jQuery( '#loadingLayer' ).ajaxComplete( function(){
				jQuery( this ).css( 'visibility', 'hidden' );
			} );
		/*
		if ( indicatorElement ){
			jQuery( 'body' ).append( indicatorElement );
		}

		jQuery( 'body' ).ajaxStart( function(){
			jQuery( this ).addClass( 'loading' );
		} );

		jQuery( 'body' ).ajaxComplete( function(){
			jQuery( this ).removeClass( 'loading' );
		} );
		*/
	},

	// custom functions
	
	manageEditButton : function( callerSelector, parentSelector, placeholderSelector ){
			function addEditButton(){
				jQuery( parentSelector + ' ' + placeholderSelector ).remove();
				jQuery( this ).after( '<div id="' + placeholderSelector.replace( /#/, '' ) + '"></div>' );
				jQuery.get( this.href, { AJAXLoad : placeholderSelector }, function( text ){
					XPE.replaceContent( parentSelector + ' ' + placeholderSelector, text )
				} );
			}

			jQuery( callerSelector ).live( 'click', addEditButton );
		}
}

