function delegate(object, method){
	return function(){
		return method.apply(object, arguments);
	};
}

/******************* FileManager ************************/
function FileManager(selector, path){
	$(selector).click(delegate(this, this.GetList));
	this.path    = path;
	this.iconEl  = 0;
	this.fieldEl = 0;
	this.listEl  = 0;
	this.data    = 0;
	this.speed   = 0;

	this.Init();
}

FileManager.prototype = {
	Init: function(){
		this.speed = 400;
		var html =
			'<div id="file-list">' +
				'<div align="right">' +
					'<img id="close-file-list" src="/images/icons/cross.png" alt="" title="закрыть">' +
				'</div>' +
				'<div id="cont-file-list"></div>' +
			'</div>';
		$("body").append(html);
		this.listEl = $("#file-list");
	},
	GetList: function(e){
		this.iconEl  = $(e.target);
		this.fieldEl = this.iconEl.prev("input");
		var self = this;
		$.ajax({
			type: "POST",
			url:  "/admin/FileManager/get-contents-directory/",
			data: {TargetDir : self.path},
			success: function(d){
				self.data = eval("("+ d + ")");
				self.RenderList();
			}
		});
	},
	RenderList: function(){
		var positionList = this.fieldEl.offset();
		positionList.top += this.fieldEl.height() + 4 +
			parseInt(this.fieldEl.css("padding-top")) +
			parseInt(this.fieldEl.css("padding-bottom"));

		var width = this.fieldEl.width() +
			parseInt(this.fieldEl.css("padding-left")) +
			parseInt(this.fieldEl.css("padding-right"));

		this.listEl.css({
			top: positionList.top,
			left: positionList.left,
			width: width
		});

		var tabEl  = "<ul>";
		for(var key in this.data){
			tabEl += "<li><img class=\"selectable\" src=\"/" + this.data[key] +
				"\" alt=\"" + this.data[key] + "\" title=\"" + this.data[key] + "\"></li>";
		}
		tabEl += "</ul>";
		$("div#cont-file-list").html(tabEl);
		this.listEl.show(this.speed);
		$("img#close-file-list").bind("click", delegate(this, this.CloseList));
		$("img.selectable").bind("click", delegate(this, this.SetValue))
	},
	CloseList: function(){
		$("img#close-file-list").unbind();
		$("img.selectable").unbind();
		this.listEl.hide(this.speed);
	},
	SetValue: function(e){
		this.fieldEl.val($(e.target).attr("src"))
		this.CloseList();
	}
}
/********************************************************/

/*********************** FloatWin ***********************/
// <select><input type="hiddeh"><img>
function FloatWin(selector, miscParam){
	$(selector).click(delegate(this, this.ShowWindow));
	this.param     = miscParam;
	this.iconEl    = 0; // иконка добавления итема
	this.hideEl    = 0; // скрытое поле перед иконкой добавления итема
	this.fieldEl   = 0; // тег селект
	this.winEl     = 0; // всплывающее окно
	this.inputEl   = 0; // текстовое поле в окне
	this.imgEl     = 0; // иконка сохранения в окне
	this.speed     = 200;
	this.isClicked = false;

	this.Init();
}

FloatWin.prototype = {
	Init: function(){
		var html =
			'<div id="floatWin">' +
				'<input type="text">' +
				'<img src="/images/icons/disk.png">' +
			'</div>';
		$("body").append(html);
		this.winEl   = $("#floatWin");
		this.inputEl = $("#floatWin input");
		this.imgEl   = $("#floatWin img");
	},
	ShowWindow: function(e){
		this.isClicked = !this.isClicked;
		if(!this.isClicked){
			this.CloseWin();
			return;
		}
		this.iconEl  = $(e.target);
		var siblings = this.iconEl.siblings()
		this.fieldEl = $(siblings.get(0));
		this.hideEl  = $(siblings.get(1));
		var positionWin = this.fieldEl.offset();
		positionWin.top += this.fieldEl.height() + 4 +
			parseInt(this.fieldEl.css("padding-top")) +
			parseInt(this.fieldEl.css("padding-bottom"));

		var width = this.fieldEl.width() + 16 +
			parseInt(this.fieldEl.css("padding-left")) +
			parseInt(this.fieldEl.css("padding-right"));

		this.inputEl.css({
			width: width - 21
		});

		this.winEl.css({
			top: positionWin.top,
			left: positionWin.left,
			width: width
		});
		this.imgEl.bind("click", delegate(this, this.AddValue));
		this.inputEl.focus();
		this.winEl.show(this.speed);
	},
	AddValue: function(e){
		var self = this;
		$.ajax({
			type: "POST",
			url:  "/admin/enum/add-item-to-enum/",
			data: {
				'item.EnumID': self.hideEl.val(),
				'item.Item'  : self.inputEl.val()
			},
			success: function(d){
				var raw = d;
				d = parseInt(d);
				if(d > 0){
					self.GetEnum(d);
				}else{
					alert(raw['item.Item']);
				}
			}
		});
		this.CloseWin();
	},
	GetEnum: function(itemID){
		var self = this;
		$.ajax({
			type: "POST",
			url:  "/admin/enum/get-enum/",
			data: {enumID: self.hideEl.val()},
			success: function(list){
				self.UpdateEnum(itemID, list);
			}
		});
	},
	UpdateEnum: function(itemID, list){
		var html = '';
		for(var i in list['items']){
			html += '<option value="' +
				list['items'][i]['ItemKey'] +
				((list['items'][i]['ItemID'] == itemID) ? '" selected>' : '">') +
				list['items'][i]['ItemValue'] +
				'</option>';
		}
		this.fieldEl.html(html);
	},
	CloseWin: function(){
		this.isClicked = false;
		this.imgEl.unbind();
		this.inputEl.val('');
		this.winEl.hide(this.speed);
	}
}
/********************************************************/

/*********************** EditField **********************/
function EditField(selector){
	$(selector).click(delegate(this, this.ShowField));
	this.speed     = 200;
	this.isClicked = false;
	this.editField = 0; // всплывающее окно
	this.inputEl   = 0; // текстовое поле в окне
	this.imgEl     = 0; // иконка сохранения в окне
	this.iconEl    = 0; // иконка добавления перечисления
	this.fieldEl   = 0; // тег селект

	this.Init();
}

EditField.prototype = {
	Init: function(){
		var html =
			'<div id="editField">' +
				'<input type="text">' +
				'<img src="/images/icons/disk.png">' +
			'</div>';
		$("body").append(html);
		this.editField = $("#editField").hide();
		this.inputEl   = $("#editField input");
		this.imgEl     = $("#editField img");
	},
	ShowField: function(e){
		this.isClicked = !this.isClicked;
		if(!this.isClicked){
			this.CloseWin();
			return;
		}
		this.iconEl  = $(e.target);
		var siblings = this.iconEl.siblings()
		this.fieldEl = $(siblings.get(0));
		var positionWin = this.fieldEl.offset();
		positionWin.top += this.fieldEl.height() + 4 +
			parseInt(this.fieldEl.css("padding-top")) +
			parseInt(this.fieldEl.css("padding-bottom"));

		var width = this.fieldEl.width() + 16 +
			parseInt(this.fieldEl.css("padding-left")) +
			parseInt(this.fieldEl.css("padding-right"));

		this.inputEl.css({
			width: width - 22
		});

		this.editField.css({
			top: positionWin.top,
			left: positionWin.left,
			width: width
		});
		this.imgEl.bind("click", delegate(this, this.AddValue));
		this.inputEl.focus();
		this.editField.show(this.speed);
	},
	AddValue: function(e){
		var self = this;
		$.ajax({
			type: "POST",
			url:  "/admin/enum/add-enum/",
			data: {'enum.Name': self.inputEl.val()},
			success: function(d){
				var raw = d;
				d = parseInt(d);
				if(d > 0){
					self.GetEnumList(d);
				}else{
					alert(raw['enum.Name']);
				}
			}
		});
		this.CloseWin();
	},
	GetEnumList: function(enumID){
		var self = this;
		$.ajax({
			type: "POST",
			url:  "/admin/enum/get-enum-list/",
			success: function(d){
				self.UpdateAllEnum(d);
				self.fieldEl.children('option').each(function(){
					if($(this).val() == enumID){
						$(this).attr('selected', 'selected');
					}
				});
			}
		});
	},
	UpdateAllEnum: function(enumList){
		var html = '';
		for(var i in enumList){
			html += '<option value="' +
				enumList[i]['ID'] + '">' + enumList[i]['Name'] +
				'</option>'
		}
		$(".enum-list").each(function(i){
			var selectedID = $(this).val();
			$(this).html(html);
			$(this).children('option').each(function(i){
				if($(this).val() == selectedID){
					$(this).attr('selected', 'selected');
				}
			});
		});
	},
	CloseWin: function(){
		this.isClicked = false;
		this.imgEl.unbind();
		this.inputEl.val('');
		this.editField.hide(this.speed);
	}
}
/********************************************************/

$().ready(function() {
	var url = document.location.href;
	$('a.print').attr('href', url + (url.match(/\?/) ? "&print=1" : "?print=1"));

	$('table.grid tr:odd' ).addClass('odd');
	$('table.grid tr:even').addClass('even');

	var over = function() {$(this).addClass   ('hover');};
	var out  = function() {$(this).removeClass('hover');};

	$('table.grid tr').hover(over, out);

	$('table.grid tr').bind("click", function(e){
		if(e.target.tagName == "TD" || e.target.tagName == "A"){
			var checkBox = $(this).children("td:last").children("input:first");
			checkBox.attr('checked', (checkBox.attr('checked')) ? '' : 'checked');
		}
	});
});


function Element(type, id, callback){
	this.html = "";
	switch (type) {
		case "text":
			this.html = '<input id="' + id + '" type="text">';
			break;
		case "hidden":
			this.html = '<input id="' + id + '" type="hidden">';
			break;
		case "img":
			this.html = '<img id="' + id + '">';
			break;
		default:
			break;
	}
	this.id   = id;
	this.call = callback;
}

Element.prototype = {
	GetHtml: function(){
		return this.html;
	}
}



function CWindow(winID){
	var html = '<div id="' + winID + '" class="bnfs-win"></div>';
	$("body").append(html);

	this.html  = html;
	this.winID = winID;
	this.winEl = $("#" + winID);
	this.x = 0;
	this.y = 0;
	this.elements = {};
	this.visible = false;
}

CWindow.prototype = {
	AddElement: function(element){
		var html = this.winEl.html();
		html += element.GetHtml();
		this.winEl.html(html);
		this.elements[element.id] = $("#" + element.id);
	},
	GetElement: function(id){
		return this.elements[id];
	},
	SetPosition: function(x, y){
		this.winEl.css({
			top: x,
			left: y
		});
	},
	Show: function(speed){
		this.visible = true;
		this.winEl.show(speed);
	},
	Hide: function(speed){
		this.visible = false;
		this.winEl.hide(speed);
	},
	IsVisible: function(){
		return this.visible;
	}
}
