/**
 * Common JavaScript functions
 *
 */
var LB = "\n";
var TAB = "\t";
var EDC = '<!-- -->';

var POS_TOP_LEFT = 1;
var POS_TOP = 2;
var POS_TOP_RIGHT = 3;
var POS_LEFT = 4;
var POS_CENTER = 5;
var POS_RIGHT = 6;
var POS_BOTTOM_LEFT = 7;
var POS_BOTTOM = 8;
var POS_BOTTOM_RIGHT = 9;

var MSG_TYPE_OK = 1;
var MSG_TYPE_ERROR = 2;

var LOCALE = 'hu_HU';

/**
 * onLoad listener arrays
 *
 */
window.onLoadListeners = new Array();
window.onLoadListenerArgs = new Array();

/**
 * Add onLoad listener
 *
 * @param listener function
 * @param args object
 * @return void
 */
window.addOnLoadListener = function (listener, args) {
	var listenerLength = window.onLoadListeners.length;

	if (typeof(listener) == 'function') {
		window.onLoadListeners[listenerLength] = listener;

		if (typeof(args) != 'undefined') {
			window.onLoadListenerArgs[listenerLength] = args;
		} else {
			window.onLoadListenerArgs[listenerLength] = null;
		}
	}
}

/**
 * Call onLoad functions
 *
 * @return void
 */
window.onload = function() {
	for (var i=0; i<window.onLoadListeners.length; i++) {
		var listener = window.onLoadListeners[i];
		var args = window.onLoadListenerArgs[i];

		if (typeof listener == 'function') {
			listener.call(this, args);
		}
	}

}

/**
 * Translate
 *
 * @param str string
 * @return string
 */
function __(str) {
	if (isObject(app) && app.checkModule('dictionary')) {
		return app.dictionary.translate(str);
	}
	return str;
}

/**
 * Call object function
 *
 * @param fn string
 * @param args array
 * @return void
 */
function call(fn, args) {
	var fnStr = fn;
	
	try {
		if (isString(fn) && fn.length) {
			var fnObj = fn.split('.');
			
			if (isArray(fnObj) && fnObj.length > 1) {
				if (arguments.length > 2) {
					args = Array.prototype.slice.call(arguments);
					args.shift();
				}
		
				fn = eval(fn);
				
				fnObj.pop();
				var context = eval(fnObj.join('.'));
				
				if (isFunction(fn) && isObject(context)) {
					fn.call(context, args);
				} else {
					throw 'Invalid or missing function: '+fnStr;
				}
			} else {
				throw 'Invalid function string: '+fnStr;
			}
		} else {
			throw 'Missing or invalid function string: '+fnStr;
		}
	} catch (e) {
		if (isObject(app) && app.checkModule('debug')) {
			app.debug.error(e);
		}
	}
}

/**
 * Get function name
 *
 * @params fn string
 * @params context object
 * @return string
 */
function getFunctionName(fn, context) {
	if (isFunction(fn) && isObject(context)) {
		for (var prop in context) {
			if (context[prop] == fn) {
				return prop;
			}
		}
	}
	return null;
}

/**
 * Check null
 *
 * @param input mixed
 * @return boolean
 */
function isNull(input) {
	return (input == null);
}

/**
 * Check object
 *
 * @param input mixed
 * @return boolean
 */
function isObject(input) {
	return (typeof(input) == 'object' && !this.isNull(input));
}

/**
 * Check array
 *
 * @param input mixed
 * @return boolean
 */
function isArray(input) {
	return (isObject(input) && (input instanceof Array));
}

/**
 * Check string
 *
 * @param input mixed
 * @return boolean
 */
function isString(input) {
	return (typeof(input) == 'string' && !this.isNull(input));
}

/**
 * Check undefined
 *
 * @param input mixed
 * @return boolean
 */
function isUndefined(input) {
	return (typeof(input) == 'undefined');
}

/**
 * Check defined
 *
 * @param input mixed
 * @return boolean
 */
function isDefined(input) {
	return (typeof(input) != 'undefined');
}

/**
 * Check function
 *
 * @param input mixed
 * @return boolean
 */
function isFunction(input) {
	return $.isFunction(input);
}

/**
 * Check value in array
 *
 * @param value mixed
 * @param array array
 * @return boolean
 */
function inArray(value, array) {
	if ($.inArray(value, array) > -1) {
		return true;
	}
	return false;
}

/**
 * Check form
 *
 * @param input mixed
 * @return boolean
 */
function isForm(input) {
	return (isObject(input) && isDefined(input.nodeName) && input.nodeName.toLowerCase() == 'form');
}

/**
 * Merge objects
 *
 * @param src object
 * @param ext object
 * @return object
 */
function mergeObjects(src, ext) {
	if (isObject(src) && isObject(ext)) {
		for (prop in ext) {
			if (isObject(ext[prop]) && isObject(src[prop])) {
				mergeObjects(src[prop], ext[prop]);
			} else {
				src[prop] = ext[prop];
			}
		}
	}
	return src;
}

/**
 * Get viewport dimensions
 *
 * @return object
 */
function getViewportDimensions() {
	var dDim = getObjectDimensions(document);
	var wDim = getObjectDimensions(window);
	var width, height = 0;
	
	if (isObject(app) && app.checkModule('browser') && app.browser.isIE) {
		width = ((wDim.width < dDim.width) ? wDim.width : dDim.width);
		height = ((dDim.height - wDim.height) < 20) ? wDim.height : dDim.height;

		if (wDim.scrollLeft) {
			width += wDim.scrollLeft;
		}
	} else {
		width = dDim.width;
		height = dDim.height;
	}
	return {width: width, height: height};
}

/**
 * Get object dimension properties
 *
 * @param obj object
 * @return object
 */
function getObjectDimensions(obj) {
	var width, height, offset, scrollLeft, scrollTop = null;

	if (isObject(obj)) {
		width = $(obj).width();
		height = $(obj).height();
		offset = $(obj).offset();
		scrollLeft = $(obj).scrollLeft();
		scrollTop = $(obj).scrollTop();
	}

	var dim = {
		width: (isNull(width) ? 0 : width),
		height: (isNull(height) ? 0 : height),
		left: ((isObject(offset) && offset.hasOwnProperty('left')) ? offset.left : 0),
		top: ((isObject(offset) && offset.hasOwnProperty('top')) ? offset.top : 0),
		scrollLeft: (isNull(scrollLeft) ? 0 : scrollLeft),
		scrollTop: (isNull(scrollTop) ? 0 : scrollTop)
	};
	return dim;
}

/**
 * Set object position
 *
 * @return void
 */
function setObjectPosition(obj, position) {
	if (isObject(obj)) {
		var dim = getObjectDimensions(obj);
		var wDim = getObjectDimensions(window);
		var left, top = 0;

		if (isObject(position)) {
			if (isArray(position)) {
				left = position[0];
				top = position[1];
			} else {
				if (position.hasOwnProperty('left')) {
					left = position.left;
				}
				if (position.hasOwnProperty('top')) {
					top = position.top;
				}
			}
		}

		if (typeof(position) == 'number') {
			switch(position) {
				case POS_TOP_LEFT:
					left = wDim.scrollLeft;
					top = wDim.scrollTop;
					break;
				case POS_TOP:
					left = Math.ceil((wDim.width - dim.width) / 2) + wDim.scrollLeft;
					top = wDim.scrollTop;
					break;
				case POS_TOP_RIGHT:
					left = (wDim.width + wDim.scrollLeft) - dim.width;
					top = wDim.scrollTop;
					break;
				case POS_LEFT:
					left = wDim.scrollLeft;
					top = Math.ceil((wDim.height - dim.height) / 2) + wDim.scrollTop;
					break;
				case POS_CENTER:
					left = Math.ceil((wDim.width - dim.width) / 2) + wDim.scrollLeft;
					top = Math.ceil((wDim.height - dim.height) / 2) + wDim.scrollTop;
					break;
				case POS_RIGHT:
					left = (wDim.width + wDim.scrollLeft) - dim.width;
					top = Math.ceil((wDim.height - dim.height) / 2) + wDim.scrollTop;
					break;
				case POS_BOTTOM_LEFT:
					left = wDim.scrollLeft;
					top =  (wDim.height + wDim.scrollTop) - dim.height;
					break;
				case POS_BOTTOM:
					left = Math.ceil((wDim.width - dim.width) / 2) + wDim.scrollLeft;
					top =  (wDim.height + wDim.scrollTop) - dim.height;
					break;
				case POS_BOTTOM_RIGHT:
					left = (wDim.width + wDim.scrollLeft) - dim.width;
					top =  (wDim.height + wDim.scrollTop) - dim.height;
					break;
				default:
					left = Math.ceil((wDim.width - dim.width) / 2) + wDim.scrollLeft;
					top = Math.ceil((wDim.height - dim.height) / 2) + wDim.scrollTop;
					break;
			}
		}

		obj.css({
			top: top+'px',
			left: left+'px'
		});
	}
}


function reloadPage() {
	window.location.reload(true);
}

function redirectPage(url) {
	if (url) {
		window.location.replace(url);
	}
}

function jumpToHash(hash) {
	if (hash) {
		window.location.hash = hash;
	}
}

/**
 * PHP like substr function
 *
 * @return String
 */
function substr(str, start, len) {

    str += '';
    var end = str.length;
    if (start < 0) {
        start += end;
    }
    end = typeof len === 'undefined' ? end : (len < 0 ? len + end : len + start);
    return start >= str.length || start < 0 || start > end ? !1 : str.slice(start, end);
}

String.prototype.toBoolean = function() {
    return (/^(true|yes|1)$/i).test(this);
};

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, '');
}

String.prototype.ltrim = function() {
	return this.replace(/^\s+/, '');
}

String.prototype.rtrim = function() {
	return this.replace(/\s+$/, '');
}
