function define(tplName, tplVal)
{
	try{ eval(tplName + "='" + tplVal + "';");} catch(e){ alert(e + 'Ошибка создание шаблона')};	
}

function _each(obj, pFun)
{
	for (var key in obj)
	{
		if ((key != 'indexOf') && (key != 'each'))
		{
			pFun.call(obj, obj[key], key);
		}
	}								
}

function _t(tpl)
{
	var sText = tpl;
	var pos = 1;
	while (pos < arguments.length)
	{
		var arg1 = arguments[pos];
		var arg2 = (typeof(arguments[pos + 1]) == 'undefined') ? false : arguments[pos + 1];
		if (typeof(arg1) == 'object')
		{
			_each(arg1, function(val, key)
			{				
				if (val != null)
				{
					if (!((val instanceof Object) || (val instanceof Array)))
						sText = _t(sText, key.toString(), val.toString());				
				}
			});
		}
		else if (((typeof(arg1) == 'string') || (typeof(arg1) == 'number'))
						 && ((typeof(arg2) == 'string') || (typeof(arg2) == 'function') || (typeof(arg2) == 'number')))
		{			
			if (typeof(arg2) == 'function')
			{
				sText = arg2(arg1, sText);
			}
			else
			{
				var re = new RegExp('\\#\\{' + arg1 + '\\}', 'ig');
				sText  = sText.replace(re, arg2);
			}
			
			pos ++;		
		}
		else if ((typeof(arg1) == 'string') && ((typeof(arg2) == 'object') || (arg2 instanceof Array)))
		{
			var sMarker = '##' + arg1 + '##';
			var vBegin = sText.indexOf(sMarker);
			var vEnd   = sText.indexOf(sMarker, vBegin + 4);			
			var sBlock = sText.substring(vBegin + 4 + arg1.length, vEnd);			
			var txt  = '';
	
			_each(arg2, function(val, key)
			{
				val['_key'] = key;
				txt += _t(sBlock, val);			
			});
			
			sText = sText.substr(0, vBegin) + txt + sText.substr(vEnd + 4 + arg1.length);
			pos++;
		}
		
		pos++;
	}

	return sText;
}

function _c(tpl)
{
	var tx = tpl;
	var pos = 1;
	while (pos < arguments.length)
	{
		
		var arg1 = arguments[pos];
		var arg2 = (typeof(arguments[pos + 1]) == 'undefined') ? false : arguments[pos + 1];
		if (typeof(arg1) == 'object')
		{
			_each(arg1, function(val, key){ if (!val) tx = _c(tx, key, val);});			
		}
		else
		{
			var sMarker = '#!' + arg1 + '!#';
			var vLength = sMarker.length;
			var vBegin  = tx.indexOf(sMarker);
			if (arg2)
			{
				var re = new RegExp(sMarker,'ig');
				tx = tx.replace(re, '');
			}
			else
			{
				while (vBegin >= 0)
				{
					var vEnd = tx.indexOf(sMarker, vBegin + 4);
					tx = tx.substr(0, vBegin) + tx.substr(vEnd + vLength);
					
					vBegin = tx.indexOf(sMarker);
				}					
			}
			
			pos++;
		}		
		pos++;
	}
	
	var res = -1;
	while((res = tx.search(/\#\#([^\#]*)\#\#/ig)) >= 0)
	{
		tx = _t(tx, RegExp.$1, []);
	}
	
	res = -1;
	while((res = tx.search(/\#\!([^\!]*)\!\#/ig)) >= 0)
	{
		tx = _c(tx, RegExp.$1, false);
	}
	return tx.replace(/\#\{[^\}]*\}/ig, '');
}

function _echo(sMSG)
{
  WScript.Echo(sMSG);
}

function isset(oObj)
{
	if (typeof(oObj) == 'boolean') return oObj;
	return ((typeof(oObj) != 'undefined') && (oObj != null));
}

function MailValid(mail)
{
 var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
 return (re.test(mail));
} 

function _int(sVal)
{
	return parseInt(sVal);	
}

function _map(data)
{
	_each(data, function(val, key)
	{
		var obj = jQuery('#' + key);

		if ((obj.length) && (val != null))
		{
			switch(obj.attr('class'))
			{
				case 'radio_group' :
					obj.radio(val);
					break;
				case 'check_list' :
					break;
				case 'check' :
					obj.check(val);	
					break;
				case 'rate' :
					obj.rate(5, val);
					break;
				default:
					var tag  = obj.get(0).tagName.toLowerCase();
					var tags = 'input;textarea;select;';
					if (tags.indexOf(tag) >= 0) obj.val(val);					
					else obj.html(val);

					break;
			}
		}
	});
}

function TextParse(str)
{
	return str;
}

function _rmap(data)
{
	var res = {};
	_each(data, function(val, key)
	{
		if (data instanceof Array) key = val;
		var obj = jQuery('#' + key);
		if (obj.length)
		{						
			switch(obj.attr('class'))
			{			
				case 'check' :
					res[key] = obj.check();
					break;
				case 'check_list' :								
					res[key] = obj.checkList();
					break;
				case 'radio_group' :
					res[key] = obj.radio();
					break;
				case 'rate' :
					res[key] = obj.attr('val');
					break;
				default :
					var tag  = obj.get(0).tagName.toLowerCase();
					var tags = 'input;textarea;select;';
					if (tags.indexOf(tag) >= 0) res[key] = TextParse(obj.val());
					else res[key] = TextParse(obj.html());
					break;
			}
		}
	});
	
	return res;
}

function _union(src, dst)
{
	_each(dst, function(val, key)
	{
		src[key] = val;
	})
}

//data 
//--num_pages : всего страниц
//--curr_page : текущая страница
//--num_recs  : всего записей
//--tpl_href  : шаблон ссылки с параметром #{pg}
//--[max_pages] : максимальное кол-во видимых страниц 
/*function PageGen(data)
{
	var max_pages = (isset(data['max_pages'])) ? data['max_pages'] : 10;//10 на страницу
	var content 	= '';
	var min = 0;
	var max = data['num_pages'];
	if (data['curr_page'] > max_pages)
	{
		min = data['curr_page'] - (data['curr_page'] % max_pages);
		max = min + max_pages;
		if (max > data['num_pages']) max = data['num_pages'];
	} else max = (data['num_pages'] > data["max_pages"]) ?  data["max_pages"] : data["num_pages"];
	
	for (var i = min; i < max; i++)
	{
		active   = (data['curr_page'] == i) ? 'class="pg_active"' : 'class="pg"';
		content += _t(data['tpl_href'], 'pg', i, 'pg_str', i + 1, 'active', active);
	}	
	
	if (min > 0) content = _t(data['tpl_href'], 'pg', min - 1, 'pg_str', '«') + content;
	if (max < data['num_pages']) content += _t(data['tpl_href'], 'pg', max, 'pg_str', '»');
	
	return content;
}*/
function PageGen(data)
{
	var max_pages = (isset(data['max_pages'])) ? data['max_pages'] : 10;//10 на страницу
	var content 	= '';
	var min = 0;	
	var max = 0;
	
	if (data['curr_page'] >= max_pages)
	{
		min = data['curr_page'] - (data['curr_page'] % max_pages);
		max = min + max_pages;
		if (max > data['num_pages']) max = data['num_pages'];
	}
	else max = (data['num_pages'] > data["max_pages"]) ?  data["max_pages"] : data["num_pages"];
	
	for (var i = min; i < max; i++)
	{
		var active = (data['curr_page'] == i) ? 'class="pg_active"' : 'class="pg"';
		content 	+= _t(data['tpl_href'], 'pg', i, 'pg_str', i + 1, 'active', active);
	}
	
	if (min > 0) content = _t(data['tpl_href'], 'pg', min - 1, 'pg_str', '«') + content;
	if (max < data['num_pages']) content += _t(data['tpl_href'], 'pg', max, 'pg_str', '»');
	
	return content;	
}

//ajax libs
var g_modules = {};
var g_call = {};
var g_fromDispatch = false;

function Dispatch(hash)
{      
	if (hash.length == 0)
	{			
		return;
	}	
	
	var srch = hash.match(/(g\_[a-z\d]+)(\.[a-z\d]+)\((.*)\)/i);
	if (srch != null)
	{
		var args = srch[3].split(',');
		
		_each(args, function(val, key)
		{
			var re = /^[\d\.]+jQuery/;
			if (re.test(val)) args[key] = Number(val);
			else args[key] = new String(decodeURI(val));
		});
		try
		{
			eval('var refObj=' + srch[1] + ';');
			eval('var refFun='  + srch[1] + srch[2] + ';');		
			g_fromDispatch = true;
			refFun.apply(refObj, args);					
		}
		catch(e){};
	}
	
	g_fromDispatch = false;
}
	
function include(sInclude, sCall)
{		
	var sInclude = sInclude;
	var sCall    = sCall;
	
	if (!isset(g_modules[sInclude]))
	{
		var script   = document.createElement("script");
		script.type  = 'text/javascript';
		script.defer = true;
		script.src   = sInclude;
		
		document.getElementsByTagName('head')[0].appendChild(script);		
		
		g_call[sInclude] = 0;
		
		jQuery.timer(400, function(timer)
		 {			 
				if (isset(g_modules[sInclude]))
				{					
					g_call[sInclude] = 0;
					timer.stop();
					if (isset(sCall)) {	try{ eval(sCall);} catch(e){ alert(e)};};				
					return true;
				}
				
				if (g_call[sInclude] > 4)
				{					
					timer.stop();
					alert(sInclude + ' failed');
					return false;
				} else g_call[sCall] ++;				
		 });			
	}
	else
	{
		if (isset(sCall)) {try{ eval(sCall);} catch(e){ alert('Debug On:' + e);};};
		return true;
	}
}

function HashSet(hash)
{
	hash = hash.replace(/^.*#/, '');

	if (jQuery.browser.opera)
	{
		var href = document.location.href.replace(/[\?\&]tm=[^\&]*/i,'').replace(/\#.*/i,'');
		var lab  = (href.indexOf('?') > 0) ? '&' : '?';
		document.location.assign(href + lab + 'tm=' + (new Date()).getTime() + '#' + hash);
	}        
	else
	{         
		jQuery.historyLoad(hash);
	}
}


jQuery.timer = function (interval, callback)
{
 var interval = interval || 100;

 if (!callback)
	 return false;
 
 _timer = function (interval, callback) {
	 this.stop = function () {
		 clearInterval(self.id);
	 };
	 
	 this.internalCallback = function () {
		 callback(self);
	 };
	 
	 this.reset = function (val) {
		 if (self.id)
			 clearInterval(self.id);
		 
		 var val = val || 100;
		 this.id = setInterval(this.internalCallback, val);
	 };
	 
	 this.interval = interval;
	 this.id = setInterval(this.internalCallback, this.interval);
	 
	 var self = this;
 };
 
 return new _timer(interval, callback);
};

function wrap(obj)
{
	if (!isset(obj._precall)) return;
	obj._refs = {};

	var key;	
	for (key in obj)	
	{
		if ((typeof(obj[key]) == 'function') && (key.substr(0,1) != '_'))
		{			
			obj._refs[key] = obj[key];
			obj[key] = new Function('\
				this._precall();\
				this._refs["' + key + '"].apply(this, arguments);\
			');
		}
	}
}
			
function Timer(fun, type, interval, funret)
{
	this.fun      = fun;
	this.interval = interval;
	this.funret   = funret;
	
	var self = this;
	
	this.callBack = function()
	{					
		self.fun[1].apply(self.fun[0], self.fun[2]);
		if (isset(self.funret)) self.funret(self);
	}

	this.start = function()
	{
		this.id = (type == 1) ? setInterval(this.callBack, this.interval) :  setTimeout(this.callBack, this.interval);					
	}
	
	this.stop = function()
	{
		(type == 1) ? clearInterval(this.id) : clearTimeout(this.id);
	}
	
	this.reset = function()
	{
		this.stop();
		this.start();
	}
	
	this.start();
}

function _w(id, data)
{
	jQuery('#' + id).html(data);
}

function _wp(id, data)
{
	jQuery('#' + id).prepend(data);
}
function _wa(id, data)
{
	jQuery('#' + id).append(data);
}