﻿function vkuku(im, zn) {//запись переменной в куку
    var t = new Date();
    var t2 = new Date(t.getTime()  + 1000*60*60*24 * 30);
    document.cookie = "" + im + "=" + zn + "; expires=" +  t2.toGMTString();
};

function izkuki(im) {//чтение переменной из куки
var maska = new RegExp("; " + im + "=([^;]*)","ig");
if (arr = maska.exec("; " + document.cookie + "; ")) return arr[1];
return false;
};


function godinnik(sel) {
	var d = new Date();
	var h = '00' + d.getHours();
	var m = '00' + d.getMinutes();
	var s = '00' + d.getSeconds();
	jQuery(sel).html('' + h.substr(h.length - 2,2) + ':' + m.substr(m.length - 2,2) + ':' + s.substr(s.length - 2,2));
}


function Kiborg(nazva, master, vhod) {
	this.pasport = {};//эти поля передаются без изменений
	this.tuda = {};//эти поля текущего состояния
	this.tuda.navi_stranica = 0; //текущая страница
	this.forma = {};//поля форм, если надо
	
	this.nazva = nazva;
	this.pasport.nazva = nazva;
	prog.o[nazva] = this;

	this.pasport.master = master;//кто на сервере отвечает за функционал
	this.pasport.json = true;

	//где живут роботы (сервер возвращает роботов, они размещаются в jQuery-селекторах
	this.domiki_robotov = {}; //результаты json привязаны к элементам dom
	this.domiki_robotov.protokol = '#protokol';
	this.domiki_robotov.nazva = '#'+nazva+'telo';
	this.domiki_robotov.telo = '#'+nazva+'telo';

		
	jQuery.extend(this, vhod);
	
	
	this.otvet={};
	this.knopka = false;//для блокировки
    var papa = this;
	
	this.ini = function() {}; //при первом запуске документа эта функция выполняется у каждого объекта
	this.pered_zaprosom = function() {}; //чтобы легко было подключать предзагрузочные события
	
	this.navi = function(ev, str) {
		this.tuda.navi_stranica = str;
		this.zapros(false, {});
		return false;
		}; 
	
	this.zapros = function(e, mas, jqforma) {
			this.pered_zaprosom();
			if (e) { //блокируем кнопку
				this.knopka = (!e.target)?e.srcElement:e.target;
				this.knopka.disabled = true;
			};
			

			this.forma = prog.forma_v_object(jqforma);
			var a = {'forma': {}};
			jQuery.extend(true, a, this.pasport);
			jQuery.extend(true, a, this.tuda);
			jQuery.extend(true, a, mas);
			jQuery.extend(true, a.forma, this.forma);
			this.otvet = a.akt;
			
			prog.ajax(a, this.zaproserror, this.ok, jqforma);
			
		};

		
		this.zaproserror = function(t1, t2, t3) {
			if (papa.knopka) papa.knopka.disabled = false; 
		};
		
		this.ok = function (rez) {
			if (papa.knopka) papa.knopka.disabled = false;
			
			for (a in rez) {
				if (a == 'protokol' && rez[a] !== '') {
					var t = 1000 + rez[a].length*35; //задержка побольше при больших текстах
					jQuery.Growl.show({'message': rez[a], 'timeout': t});
				}
				if (papa.domiki_robotov[a]) {
					jQuery(papa.domiki_robotov[a]).html(rez[a]);
					forma.standart_povedenia(papa.domiki_robotov[a]);
				}
			}
			
			papa.ok2(rez);
			prog.s(papa.nazva, papa.otvet);
			//jQuery(papa).trigger('ok');
		};

		this.ok2 = function (rez) {}; //чтобы легко было подключать послезагрузочные события 
	
}



function ProgMotor() {
	this.o = {}; //саморегистрирующиеся объекты
	this.s = function() {}; //сюда объекты присылают свои события в виде (имя объекта, акт) 
	this.iniob = function() {
		jQuery.each(prog.o,
			function(kl, ob) {
				ob.ini();
			});
		this.proverka_editorov();
		jQuery("forma-ramka-grupp > div:first-child").bind('click', function() {
			jQuery(this.parent).toggleClass('da');
		});
	};
	this.ini = function() {
		forma.standart_povedenia();
	};
	
	this.forma_v_object = function(forma) {
		//select multiple пока не поддерживается!!
		var oforma = {};
		jQuery(forma + ' *[name]').each(function(ind, el) {
				if (el.type == 'checkbox') {
					oforma[el.name] = (el.checked)?1:0;
				} else if (el.type == 'radio') {
					if (!oforma[el.name]) oforma[el.name] = '';
					if (el.checked) oforma[el.name] = el.value;
				
				} else if (el.type == 'file') {
					//пропускаем. Для этого есть функция для HTML5 prog.files_v_FormData
					
				} else {
					if (el.tagName == "select") {
						if (el.multiple) {
							var sel = [];
							for (i=0; i<el.options.length; i++) {
								if (el.options[i].selected) sel[sel.length] = el.options[i].value;
							}
							oforma[el.name] = sel;
							
						} else {
							oforma[el.name] = el.value;
						}
					} else if (el.tagName == "TEXTAREA") {
						//если найдет редактор, то из редактора!
						if (CKEDITOR.instances[el.name]) {
							oforma[el.name] = CKEDITOR.instances[el.name].getData();
						} else {
							oforma[el.name] = jQuery(el).val();
						}
						
					} else {
						oforma[el.name] = jQuery(el).val();
					}
				}
				
			});
		
		
		return oforma;
	};
	
	
	this.files_v_FormData = function(forma, vformdata) {
		jQuery(forma + ' *[type=file]').each(function(ind, el) {
			for (var i=0; i < el.files.length; i++) {
				vformdata.append(el.name+'_file_'+i, el.files[i]);
			}
		});
	};
	
	
	this.ajax = function(a, zaproserror, zaprosok, jqforma) {
		//при HTML5 возможна передача файлов, и будет передан не массив, а FormData
		var param = {};
		
		if (window.FormData) {
			var fd = prog.v_FormData(a);
			if (jqforma) prog.files_v_FormData(jqforma, fd);
			a = fd;
			param.processData = false;
			param.contentType = false;
		}

		param.cache = false;
		param.data = a;
		param.dataType = "json";
		param.error = zaproserror;
		param.success = zaprosok;
		param.type = "POST";
		param.url = "akt.php";
		jQuery.ajax(param);
	};
	
	
	this.proverka_editorov = function() {
		try {
			var flag = CKEDITOR;
		} catch (e) {
			var flag = false;
		}
		
		if (flag == false) return;
		
		//отсоединить несуществующие
		if (CKEDITOR) 
			for (aa in CKEDITOR.instances) {
				try {
					var t = CKEDITOR.instances[aa].checkDirty();
				} catch (e) {
					CKEDITOR.instances[aa].destroy(true);
				}
			}
		//присоединить
		jQuery('.editor_class').each(function(ind, el) {
			var param = {};
			//param.width = jQuery(el).css('width');
			param.height = jQuery(el).css('height');
			//sharedSpaces - берется второй класс из className в сочетании с .editor_class_panel, 
			//вот тот див и есть панельный. пример:
			//<textarea class='editor_class panel-4'>... <div id='panel4' class='editor_class_panel panel-4'>
			param.sharedSpaces = {top: jQuery('div .editor_class_panel.'+el.className.split(' ')[1]).attr('id')} ;
			jQuery(el).ckeditor(function(){},param);
			
			});
	};
	

	this.metku_v_pole_metok = function(otkuda, kuda) {
		//берет innerText из объекта и помещает в поле с метками (разделенными запятой)
	    var tx = otkuda.text();

	    var fkuda = jQuery(kuda);
		if (fkuda.length) {
		    met = ',' + fkuda.val().replace(/ /, '') + ',';
		    if (met.indexOf(',' + tx + ',') == -1) {
		    	met += ',' + tx;  
		    } else {
		        met = met.replace(',' + tx + ',', ',');//убираем
		    };
		    met = met.replace(/,{2,}/, ',');//убираем лишние запятые
		    met = met.replace(/^,/, ''); //убирем запятую начала
		    met = met.replace(/,$/, ''); //убираем запятую конца
		
		    met = met.split(',');
			met.sort();
			met = met.toString();
			fkuda.val(met);
		};
	};

	this.v_FormData = function(mas, fd, pref) {
		if (!fd) if (!window.FormData) return mas;
		if (fd) {
			for (var dd in mas) {
				var novpref = (pref == '')?dd:pref+'['+dd+']';
				if (typeof(mas[dd]) == 'array' || typeof(mas[dd]) == 'object' ) {
					this.v_FormData(mas[dd], fd, novpref);
				} else {//
					fd.append(novpref, mas[dd]);
				}
			}
		} else {
			var fd = new FormData();
			this.v_FormData(mas, fd, '');
			return fd;
		}

	};
}


function Forma() {
	
	this.standart_povedenia = function(el) {
		jQuery('.forma-ramka-grupp .nazva', el).click(function() {jQuery(this).parent().next().slideToggle();}); 		
		jQuery('.select.file .option', el).click(function() {jQuery(this).toggleClass('tek'); } ); 		
		if ('colorbox' in jQuery) jQuery('.colorbox', el).colorbox({maxWidth: '80%', maxHeight: '80%', current: 'фото {current} из {total}'} ); 		
		jQuery('.input-sbros', el).click(function() {
			jQuery(this).parent().find('input').val(''); 
			} );
		jQuery('.knopka.pokupki')
			.find('input').input_num_slider()
			.end()
			.bind('mouseenter', function() { $('.kol', this).each(function() {if (!$(this).animated) $(this).stop(true, true).slideDown(); }  ) } )
			.bind('mouseleave', function() { $('.kol', this).each(function() {if (!$(this).animated) $(this).stop(true, true).slideUp(); }  ) } )
	;
		
	};
	
	this.po_select = function(e, multiple) {
	    var a = (!e.target)?e.srcElement:e.target;
		if (multiple !== 1) jQuery('.option', jQuery(a).closest('.select')).removeClass('tek'); 
		jQuery(a).toggleClass('tek');
	};
	
	this.po_enter = function(e, fun) {
		key = e.keyCode || e.which;
		if(key == 13) fun();
	};
	
	this.is_enter = function(e) {
		key = e.keyCode || e.which;
		return (key == 13);
	};

	this.pokaz = function(e, sel) {
	    var a = (!e.target)?e.srcElement:e.target;
	    
	    if (sel == 'sled') {
	    	if (jQuery(a).hasClass('knopka')) {
	    		jQuery(a).next().slideToggle();
	    	} else {
	    		jQuery(a).parents('.knopka').next().slideToggle();
	    	}
	    } else {
	    	jQuery(sel).slideToggle();
	    }
	};
	this.fixar = function(e, sel) {
	    var a = (!e.target)?e.srcElement:e.target;
		jQuery(a).parents(sel).toggleClass('fixarov');
		
	};
	
	this.knopka_na_papu = function(e, sel) {//включает класс родителя из sel. Класс равен переименованному классу кнопки в [класс]ov 
	    var a = (!e.target)?e.srcElement:e.target;
	    if (a.className == 'pokaz') {
			jQuery(a).parents(sel).slideToggle();
	    } else {	
			jQuery(a).parents(sel).toggleClass(a.className+"ov");
	    }
		
	};


}

jQuery.fn.forma_standart_povedenia = function(){
	
};

jQuery.fn.input_num_slider = function(options){//добавление к input кнопок "+" и "-" для изменения числового значения
	var options = jQuery.extend({}, options);
	
	return this.each(function() {
		var jthis = jQuery(this);
		if (!jthis.prev().hasClass('minus') ) 
			jthis.before("<span class='minus'>-</span>")
			.prev()
			.click(function() {
				var a = jQuery(this).next();
				if (a.val() > 0) a.val(parseInt(a.val())-1);
			} );
		if (!jthis.next().hasClass('plus')  ) jthis.after( "<span class='plus'>+</span>")
			.next()
			.click(function() {
				var a = jQuery(this).prev();
				a.val(parseInt(a.val())+1);
			} );
	});

};

