String.prototype.reverse=function(){return this.split("").reverse().join("")};

jQuery.request = jQuery.fn.request = function() {

	var complete = function(callback) {
		return function(XMLHttpRequest, textStatus){
			if (callback.container) {
				callback.container.unblock();
			}
			if((textStatus == 'error' || textStatus == 'timeout') && callback.failure){
				callback.failure.call(callback.scope || window, {
					responseText: XMLHttpRequest.responseText,
					arguments: callback.arguments
				});
			} else if(callback.success){
					callback.success.call(callback.scope || window, {
					responseText: XMLHttpRequest.responseText,
					arguments: callback.arguments
				});
			}
		};
	};

	var getJSON = function(responce) {
		return eval('(' + responce.responseText + ')');
	};

	var successHandler = function(responce) {
		var json = getJSON(responce);
		if (json && responce.arguments && responce.arguments.func) responce.arguments.func.call(this, json, responce.arguments);
		fixHeight();
	};

	// Fix panels height
	var fixHeight = function () {

		var leftDiv = $('#body-column-left');
		var rightDiv = $('#body-content-right');

		var startLeftHeight = new Number(leftDiv.attr('start_left_height'));
		var startLeftOuterHeight = new Number(leftDiv.attr('start_left_outer_height'));
		
		leftDiv.css('height', startLeftHeight + 'px');
		
		var leftHeight = leftDiv.height();
		var leftOuterHeight = leftDiv.outerHeight();
		
		var rightHeight = rightDiv.height();
		var rightOuterHeight = rightDiv.outerHeight();
		
		//alert(startLeftOuterHeight + ' - ' + rightOuterHeight)
		
		if (startLeftOuterHeight > rightOuterHeight) {
			//alert('L > R')
			var heightDiff = startLeftOuterHeight - rightOuterHeight;
			rightDiv.css('min-height', rightHeight + heightDiff + 'px');
		} else if (startLeftOuterHeight < rightOuterHeight) {
			//alert('L < R')
			var heightDiff = rightOuterHeight - startLeftOuterHeight;
			leftDiv.css('height', startLeftHeight + heightDiff + 'px');
		}
	};

	var failureHandler = function(responce) {}; 

	var get = function(options) {
		var params = {
			data: (options.data) ? options.data : null, 
			dataType: 'text', 
			type: 'GET', 
			url: (options.url) ? options.url : null, 
			complete: complete({
				scope: (options.scope) ? options.scope : this, 
				failure: failureHandler, 
				success: successHandler, 
				container: ((options.container)? options.container : null),  
				arguments: $.extend((options.arguments) ? options.arguments : {}, {func: (options.func)? options.func : null})
			})
		};
		if (options.container) {
			options.container.block({
				message: 'Loading...', 
				css: { 
					border: 'none', padding: '10px', width:   '160px', backgroundColor: '#000000', 
					'-webkit-border-radius': '5px', '-moz-border-radius': '5px', 
					opacity: 0.8, color: '#ffffff', fontSize: '0.75em'
				}, 
				overlayCSS:  {backgroundColor: '#000000', opacity: 0}
			});
		}
		jQuery.ajax(params);
	};
	
	var post = function(options) {
		data = {is_ajax: true};
		if (options.form) {
			var params = {
				type: 'POST', 
				data: data, 
				url: (options.url) ? options.url : null, 
				complete: complete({
					scope: (options.scope) ? options.scope : this, 
					failure: failureHandler, 
					success: successHandler, 
					container: ((options.container)? options.container : null), 
					arguments: $.extend((options.arguments) ? options.arguments : {}, {func: (options.func)? options.func : null})
				})
			};
			if (options.container) {
				options.container.block({
					message: 'Loading...', 
					css: { 
						border: 'none', padding: '10px', width:   '160px', backgroundColor: '#000000', 
						'-webkit-border-radius': '5px', '-moz-border-radius': '5px', 
						opacity: .8, color: '#ffffff', fontSize: '0.75em'
					}, 
					overlayCSS:  {backgroundColor: '#000000', opacity: 0}
				});
			}
			options.form.ajaxSubmit(params);
		}
	};
	if (arguments[0] && (typeof arguments[0] === 'object')) {
		var options = arguments[0];
		if (options.type && (options.type == 'post')) post(options); else get(options);
	}
}

jQuery.plugin = jQuery.fn.plugin = function(object, plugin, func, params) {
	var cmd_ = '';
	var paramsStr = '';
	if ((params) && (params instanceof Array)) {
		for (var i = 0; i < params.length; i++) {
			paramsStr += ', params[' + i + ']';
		}			
	}
	if (typeof func === 'string') cmd_ = "'" + func + "'";
	else if (typeof func === 'object') cmd_ = 'func';
	var cmd = "object." + plugin + "(" + cmd_ + "" + paramsStr + ");";
	return eval(cmd);
}

$.ui.widget.subclass('ui.component');
