/*
Package: Utils
Содержит несколько полезных функции + расширение базовых объектов.
*/

function _imgPreload(){
	var args = $A(arguments);
	for(i=0;i<args.length;i++){
		var im = new Image();
		im.src = args[i];
	}
}

/*
Func: imgPreload
Предзагрузка картинок. Принимает массив адресов, которые надо загрузить.
*/

function imgPreload(){
	var args = $A(arguments);
	var ar = new Array();
	for(var i=0;i<args.length;i++){
		ar.push('"'+args[i]+'"');
	}
	window.setTimeout("_imgPreload("+ar.join(',')+")",1);		
}

/*
Func: $S
Возвращает текущее значение селекта (не value, а текст).

Parameters:
	id - Id селекта	
*/
function $S(el){
	var e = $(el);
	return e.options[e.selectedIndex].text;
}

/* array must contents of hash {v:'bar',n:'foo'}, where v - value, n - name (text)
method is deprecated. use setData instead
*/
Element.addMethods('select',{
	load:function(element,arr,def,id,name){
		var idf = id || 'v';
		var txt = name || 'n';
		var e = $(element);
		e.options.length = 0;
		def = def || -1;
		var sel = 0;
		for(var i=0;i<arr.length;i++){
			e.options[i] = new Option(arr[i][txt],arr[i][idf]);
			if (arr[i][idf] == def){
				sel = i;
			}
		}
		e.selectedIndex = sel;
		return element;
	}
});

/*
Func: popupImage
Показывает картинку в новом окне. Пытается определить размер картинки и 
подогнать окно под него.

Parameters:
	url - Url картинки
	sign - Подпись
	author - Автор картинки
*/
function popupImage (url,sign,auth){
	var img = new Image();
	var win = window.open('','popup_image','width=200,height=200,status=no,scrollbars=yes,toolbar=no,menubar=no,location=no,resizable=1'); 
	img.onload = function(){
		var w = img.width/0.95 + 30;
		var h =  img.height/0.95 + 60;
		if (sign) h +=30;
		if (auth) h +=30;
		if (parseInt(navigator.appVersion)>3) {
			if (navigator.appName=="Netscape") {
				win.outerWidth=w;
				win.outerHeight=h;
			}else win.resizeTo(w,h);
		}
		win.document.open();
		win.document.write("<html><head>"+
/*			"<link type='text/css' rel='stylesheet' href='/s/css/main.css' ></link>"+
			"<style>body {font-family: Verdana, Arial, Helvetica, sans-serif;color: #000000;margin:0px;padding:0px;font-size: 71%;}"+
			".smalli{font-size: xx-small; color: #7f7f7f;}</style>"+*/
			"<title>");
		if (sign){	
			win.document.write(sign);
		}
		win.document.write("</title></head><body>"+
			"<table aling=center width=95%><tr><td align=center><img src='"+url+"'></td></tr>");
		if (sign){
			win.document.write("<tr><td align=center>"+sign+"</td></tr>");
		}	
		if (auth){
			win.document.write("<tr><td align=right class='smalli'>Фото:"+auth+"</td></tr>");
		}	
		win.document.write("<tr><td align=center><input type='button' value='Закрыть' onclick='window.close();'></td></tr></table></body></html>");
		win.document.close();
	};
    img.src = url;
	return false;
}

/*
Class: Eventer
Базовый класс для классов, которые хотят иметь события.

Потомки этого класса будут иметь интерфейс для формирования произвольныйх событий.

Например, пусть класс Foo определяте событие 'onpizdec'. Тогда вызывающия сторона (т.е. та,
которая использует экземпляр класса Foo, может определить действие, которое надо вызывать 
в случае, когда это событие произошло).

> var f = new Foo();
> f.addEventHandler('onpizdec',function(){alert("Полный пиздец!")});

Обработчиков событий может быть несколько. тогда они будут вызываться последовательно, пока
обработчики возвращают true.

Т.е.
> var f = new Foo();
> f.addEventHandler('onpizdec',function(){
>								if ($F('bar') == 0)
>									return true 
>								else 
>									return false});
> f.addEventHandler('onpizdec',function(){alert("Полный пиздец")});

В этом случае, если в момент возникновения события 'onpizdec' значение поля bar равно 10, то
выполнится и второй обработчик, иначе второй обработчик вызван не будет.
*/

var Eventer = Class.create({
initialize: function(){
	this._eventer = {};
},
/*
Method: addEventHandler
Добавить новый обработчки к событию

Parameters:
	ev - Название события
	f - Обработчик
*/
addEventHandler: function(ev,f){
	if (!this._eventer[ev])
		this._eventer[ev] = [];
	this._eventer[ev].push(f);
	return true;
},
/*
Method: fire
Сказать, что событие произошло.

Parameters:
	ev - Имя события
*/
fire: function (ev){
	if (!this._eventer[ev])
		return true;
	for(var i=0;i<this._eventer[ev].length;i++){
		if (!this._eventer[ev][i]())
			return true;
	}	
	return true;
},
/*
Method: clearEventHandlers
Очистить обработчики событий

Parameters:
	ev - Название события. Если указано, то убираем обработчики только этого события, иначе убираем
		все обработчики.
*/
clearEventHandlers: function(ev){
	if (ev)
		this._eventer[ev] = [];
	else
		this._eventer = {};
	return true;
}
});

Element.addMethods('SELECT', 
{
/**
Function: removeEmptyHead
Удаляет у селекта первую строчку, если она не выбрана и ее значение равно нулю.
*/
removeEmptyHead:function(e){
	e = $(e);
	if (e.options.selectedIndex != 0 && e.options[0].value == 0){
		e.options[0]=null;
	}
	return e;},
/**
Function: setData
Для селекта устанавливает данные, беря их из массива.

> var arr = [{id:'1',text:'foo'},{id:'2',text:'bar'}];
> $('my_select').setData(arr,{default:10,msg:'Выбери меня',id:'id',text:'text'});

Parameters:
	default - значение, которое должно быть выбрано по умолчанию
	msg - Если указано, то первой опцией будет добавлено это сообщение
	id - Имя поля, в котором содержаться id элемента
	text - Имя поля, в котором содержится строка, которую показывать
	klass - Имя поля, в котором лежит имя класса, который надо добавить к этой опции.(необязательно)
*/
setData:function(e,arr,c){
	var d = {msg:'','default':-1,id:'id',text:'text',klass:''};
	Object.extend(d,c || {});
	e = $(e);
	e.options.length = 0;
	var sel = 0;
	var disp = 0;
	if (d.msg){
		e.options[0] = new Option(d.msg,0);
		disp = 1;
	}
	for(var i=0;i<arr.length;i++){
		e.options[i+disp] = new Option(arr[i][d.text],arr[i][d.id]);
		Object.extend(e.options[i+disp]);
		if (arr[i][d.id] == d['default']){
			sel = i;
		}
//		if (d.klass && arr[i][d.klass])
//			e.options[i+disp].addClassName(arr[i][d.klass]);
	}
	e.selectedIndex = sel;
	return e;
}	
,
/**
Function: _getValue
Исправляем багу для IE5.5, но страемся не трогать основую функцию.

*/
_getValue:function(e){
	e = $(e);
	if (e.selectedIndex < 0)
		return undefined;
	return e.options[e.selectedIndex].value;
},
/**
Function: _setValue
Устновить в селекте значение с нужным id.
*/
_setValue:function(e,id){
	e = $(e);
	var l = e.options.length;
	for(var i=0;i<l;i++){
		if (e.options[i].value == id){
			e.selectedIndex = i;
			break;
		}
	}
}}
);

/**
 *Обертки для tinymce для определния ябблфона
 */
function addTinyMCE(bl,obj) {
	if (Prototype.Browser.MobileSafari){
		return false;
	}
	tinyMCE.execCommand('mceAddControl', bl, obj);
}

