/**
 * Ferry Brouwer
 * Wednesday 19 May 2010 - 14:54
 * jQuery based input element submit replacer
 * @param obj	:	Object {input_identifier_class, placeholder, disable_document_ready}
 */
function SubmitButton(obj){
	var _this = this;

	var input_buttons = $(document).find("input[type='submit']." + obj.input_identifier_class + ", input[type='button']." + obj.input_identifier_class);
	
	$.each(input_buttons, function(index, input_button){
		//get objects
		var form 	= getParentForm(input_button);
		var inline 	= getInline(input_button);
		var classes = getClasses(input_button, obj.input_identifier_class);
		
		//create placeholder container
		var ph = obj.placeholder.replace( /\bvalue\b/g, input_button.value );
		var container = $(document.createElement('div'));
		container.html(ph);
		
		//copy styles / classes
		$.each(inline, function(index, sp){
			container.css(sp.styleName, sp.styleValue);
		});
		$.each(classes, function(index, _class){
			container.addClass(_class);
		});
		container.css('cursor', 'pointer');
		
		//add events
		container.click(function(event){
			if ($(input_button).attr('onclick')){
				//strip the function name
				var str_func = $(input_button).attr('onclick').toString().replace(/(^\bfunction\b\s{0,20}(\bonclick\b|\banonymous\b)\((\bevent\b){0,1}\)\s{0,20}\{)|(\s{0,20}\}$)/gi, "");
				var func = new Function( $.trim(str_func) );
				func();
				
				//check if return false exist
				var rf_stripped = str_func.replace(/\breturn\b\s{1,10}\bfalse\b\;{0,1}\;/gi, "");
				var return_false = (rf_stripped.length == str_func.length) ? false : true;
				if (!return_false) $(form)[0].submit();
			}else{
				$(form)[0].submit();
			}
		});
		
		//hide / add to DOM structure
		$(input_button).hide();
		$(input_button).after(container);
		
		// if float right isn't attached, set float left
		if ( container.css('float') == 'none' )
			container.css('float', 'left');
		
		// check for margins
		if ( parseInt($(input_button).css('margin-top')) != 0)	container.css('margin-top', parseInt($(input_button).css('margin-top')));
		if ( parseInt($(input_button).css('margin-top')) != 0)	container.css('margin-left', parseInt($(input_button).css('margin-left')));
		if ( parseInt($(input_button).css('margin-top')) != 0)	container.css('margin-right', parseInt($(input_button).css('margin-right')));
		if ( parseInt($(input_button).css('margin-top')) != 0)	container.css('margin-bottom', parseInt($(input_button).css('margin-bottom')));
	});
}

/**
 * Get it's parent form
 * @param input_element : input element (child of the returned form element)
 * @return form element
 */
function getParentForm(input_element){
	var form;
	
	var endWhile = false;
	var bubbleElement = $(input_element);

	while (!endWhile){
		var type = bubbleElement[0].tagName;			
		switch (type){
			case 'FORM' :
				endWhile = true;
				form = bubbleElement;
			break;
			case 'BODY'	:
				endWhile = true;
			break;
		}
		bubbleElement = bubbleElement.parent();
	}
	
	return form;
}

/**
 * Get all style properties of input element
 * @param input_element : input element to retrieve style properties
 * @return Array of style properties [{styleName, styleValue}]
 */
function getInline(input_element){
	var inline = new Array();
	
	if ($(input_element).attr('style')){
		var sp = $(input_element).attr('style').split(';');
		for (var i=0; i<sp.length; i++){
			if ($.trim(sp[i]) != ""){
				var styleName = $.trim(sp[i].split(':')[0].toUpperCase());
				var styleValue = $.trim(sp[i].split(':')[1].toUpperCase());
				
				inline.push({
					styleName	: styleName.toString().toLowerCase(), 
					styleValue	: styleValue.toString().toLowerCase()
				});
			}
		}
	}
	
	return inline;
}

/**
 * Get all classes of input element
 * @param input_element 				: input element to retrieve classes
 * @param input_identifier_class 	: input identifier class 
 * @return Array of classes
 */
function getClasses(input_element, input_identifier_class){
	var classes = new Array();

	$.each($(input_element).attr('class').split(' '), function(index, _class){
		if ( $.trim(_class) != '' && $.trim(_class) != input_identifier_class)
			classes.push(_class);
	});
	
	return classes;
}


jQuery.fn.extend({ 
	/**
	 * set button of a single jQuery instance
	 * @param placeholder	: 	html structure to replace the input button
	 */
	 
	button: function(placeholder){
		var instance = $(this);

		//get objects
		var form 	= getParentForm(instance);
		var inline 	= getInline(instance);
		var classes = getClasses(instance, instance.attr('class'));

		//create placeholder container
		var ph = placeholder.replace( /\bvalue\b/g, $(this).val() );
		
		var container = $(document.createElement('div'));
		container.html(ph);
	
		//copy styles / classes
		$.each(inline, function(index, sp){
			container.css(sp.styleName, sp.styleValue);
		});
		$.each(classes, function(index, _class){
			container.addClass(_class);
		});
		container.css('cursor', 'pointer');
		
		//add events
		container.click(function(event){
			if (instance.attr('onclick')){
				//strip the function name
				var str_func = instance.attr('onclick').toString().replace(/(^\bfunction\b\s{0,20}(\bonclick\b|\banonymous\b)\((\bevent\b){0,1}\)\s{0,20}\{)|(\s{0,20}\}$)/gi, "");
				var func = new Function( $.trim(str_func) );
				func();
				
				//check if return false exist
				var rf_stripped = str_func.replace(/\breturn\b\s{1,10}\bfalse\b\;{0,1}\;/gi, "");
				var return_false = (rf_stripped.length == str_func.length) ? false : true;
				if (!return_false) $(form)[0].submit();
			}else{
				$(form)[0].submit();
			}
		});
		
		//hide / add to DOM structure
		//console.log(container);	
		instance.hide();
		instance.before(container);
		
		// if float right isn't attached, set float left
		if ( container.css('float') == 'none' )
			container.css('float', 'left');
		
		// check for margins
		if ( parseInt(instance.css('margin-top')) != 0)	container.css('margin-top', parseInt(instance.css('margin-top')));
		if ( parseInt(instance.css('margin-top')) != 0)	container.css('margin-left', parseInt(instance.css('margin-left')));
		if ( parseInt(instance.css('margin-top')) != 0)	container.css('margin-right', parseInt(instance.css('margin-right')));
		if ( parseInt(instance.css('margin-top')) != 0)	container.css('margin-bottom', parseInt(instance.css('margin-bottom')));
	}
});
 
