

/*
Uploader	= function(uploadPath)
{
	if !($("#"+Uploader.id))
	{
		var uploaderIframe	= '<iframe id="'+Uploader.id+'" src="'+uploadPath+'" style="display:none;"></iframe>';
		$(document).append(uploaderIframe);
	}
}
Uploader.id	= "_eobUploaderIFRM_"; 
*/

Event = function(type, data, currentTarget)
	{
		this.type				= type;
		this.currentTarget	 	= currentTarget;
		this.data				= data;
		this.defaultPrevented	= false;
		
		this.isDefaultPrevented = function()
		{
			this.defaultPrevented = true;
		}
	}
	
Event.CHANGE 	= "change";
Event.CHANGING 	= "changing";

EventDispatcher = function()
{
	var listeners		= [];
	
	this.addEventListener = function(event, handler)
	{
		if (!listeners[event])
		{
			listeners[event] = [];
		}
		listeners[event].push(handler);
	}
	
	this.dispatchEvent = function(event)
	{
		
		if (listeners && listeners[event.type])
		{
			for (i=0;i<listeners[event.type].length;i++)
			{
				
				listeners[event.type][i].apply(this, [event]);
			}
		}
	}
};





ComboBox = function(container,dataProvider,labelField,prompt,selectedValue,valueKey)
{
	this.dataProvider	= dataProvider;
	this.labelField		= labelField;
	this.valueKey		= valueKey;
	this.container		= container;
	
	this.selectedItem 	= null;
	this.selectedIndex	= -1;

	/* workaround */
	var context			= this;
	
	
	var dispatcher		= new EventDispatcher();


	$(container).empty();
	
	selectHandler = function(event)
	{
		context.selectedIndex	= $(container+" option:selected").attr("idx");

		if (context.selectedIndex == '-1')
		{
			context.selectedItem = null;
		}
		else
		{
			context.selectedItem	= context.dataProvider[context.selectedIndex];
		}
		dispatcher.dispatchEvent(new Event(Event.CHANGE, context.selectedItem, context));
	}

	
	var doubleClickHandler = function(event)
	{
		dispatcher.dispatchEvent(new Event("doubleClick", context.selectedItem, context));
	}
	
	
	/* wrapper function for EventDispatcher.addEventListener() */
	this.addEventListener = function(event, handler)
	{
		dispatcher.addEventListener(event, handler);

		if (this.firstChange)
		{
			selectHandler();
			this.firstChange = false;
		}
	}
	
	
	if (prompt)
	{
		$(container).append('<option idx="-1" value="-1">'+prompt+'</option>');
	}
	for(i in dataProvider)
	{
		$(container).append('<option idx="'+i+'" value="'+(valueKey ? dataProvider[i][valueKey] : dataProvider[i])+'">'+(labelField ? dataProvider[i][labelField] : dataProvider[i])+'</option>');
	}
	
	$(context.container).dblclick(doubleClickHandler);
	$(context.container).change(selectHandler);
	
	if (selectedValue)
	{
		$(container).val(selectedValue);	
		this.firstChange = true;
	}
}


ColorPicker = function(container,value)
{
	this.container 		= container;
	this.selectedColor 	= 0x000000; 
	
	var dispatcher	= new EventDispatcher();
	
	
	$(container).ColorPicker({
		color: value,
		onShow: function (colpkr) {
			$(colpkr).fadeIn(500);
			return false;
		},
		onHide: function (colpkr) {
			$(colpkr).fadeOut(500);
			return false;
		},
		onChange: function (hsb, hex, rgb) {
			$(container).css('backgroundColor', '#' + hex);
			this.selectedColor = hex;
			dispatcher.dispatchEvent(new Event(Event.CHANGE, this.selectedColor, this));
		}
	});
	
	
	/* wrapper function for EventDispatcher.addEventListener() */
	this.addEventListener = function(event, handler)
	{
		dispatcher.addEventListener(event, handler);
	}
	
	
}


TinyMce = function(container, scriptPath)
{
	
	return $(container).tinymce({
		// Location of TinyMCE script
		script_url : scriptPath,//'../jscripts/tiny_mce/tiny_mce.js',

		// General options
		theme : "advanced",
		plugins : "autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,advlist",

		// Theme options
		theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect",
		theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
		theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
		theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_statusbar_location : "bottom",
		theme_advanced_resizing : true,
		relative_urls : false,
		
		content_css : "style/tinyMceExtra.css",
		
		// Example content CSS (should be your site CSS)
		//content_css : "css/content.css",

		
		// Drop lists for link/image/media/template dialogs
		template_external_list_url : "lists/template_list.js",
		external_link_list_url : "lists/link_list.js",
		external_image_list_url : "lists/image_list.js",
		media_external_list_url : "lists/media_list.js"

		// Replace values for the template plugin
		/*
		template_replace_values : {
			username : "Some User",
			staffid : "991234"
		}
		*/
	});	
}



/**
 * 
 * 
 * 	POPUP CONTROL
 * 
 *  
 *
 *
	EXEMPLU UTILIZARE
	
	var content	= '<a href="javascript:changeContent();">Change content</a> <p><a href="javascript:void(0);" id="closePopup">CLOSE</p>';
	popup 	= new Popup({content:content,showUnder:false});
	popup.bindOpen("#clickHereA","click");
	popup.bindClose("#closePopup","click");
	popup.getElement().addClass("pp");
	
 *
 *
 */
function Popup(settings)
{
	// content,width, height, closeOutside,showUnder
	this.width 			= settings.width;
	this.height 		= settings.height;
	this.content 		= settings.content;
	
	this.modal			= settings.modal==undefined ? false : settings.modal;
	//this.modal			= settings.modal == undefined ? false : true;
	
	this.x				= 0;
	this.y				= 0;
	
	this.dx				= settings.dx==undefined ? 0 : settings.dx;
	this.dy				= settings.dy==undefined ? 0 : settings.dy;
	
	this.showUnder	= settings.showUnder==undefined ? false : settings.showUnder;
	
	this.closeOutside	= settings.closeOutside===false ? false : settings.closeOutside==undefined ? true : settings.closeOutside;
	
	this.centered		= settings.centered==undefined ? false : settings.centered;
	
	this.verticalCenter	= settings.verticalCenter==undefined ? true : settings.verticalCenter;
	
	var uid				= Popup.lastId;
	Popup.lastId++;
	
	this.containerId	= "popupContainer"+uid;
	var openHandlers	= [];
	var closeHandlers	= [];
	var context			= this;
	this.notClosingElements	= [];
	
	// add to dom 
	
	
	
	this.centerPopup = function()
	{
		if (context.verticalCenter)
		{
			var _top 	= ($(window).height() /2)-($("#"+context.containerId).height()/2);
			$("#"+context.containerId).css("top", 	_top+"px");		
		}
		
		var _left 	= ($(window).width() / 2) - ($("#"+context.containerId).width() / 2);		
		$("#"+context.containerId).css("left", 	_left+"px");
	}
	
	
	this.setNotClosingElements	= function(elementsArray)
	{
		context.notClosingElements	= elementsArray;
	}
	
	
	var createModalMask = function()
	{
		if (!$("#__popupModalMask__"+context.containerId) || $("#__popupModalMask__"+context.containerId).length < 1)
		{
			var documentHeight = $(document).height();
			var documentWidth = $(document).width();
			$("body").append("<div id='__popupModalMask__"+context.containerId+"'></div>");
			$("#__popupModalMask__"+context.containerId).css("position", "absolute");
			$("#__popupModalMask__"+context.containerId).css("top", "0px");
			$("#__popupModalMask__"+context.containerId).css("left", "0px");
			$("#__popupModalMask__"+context.containerId).css("height", documentHeight);
			$("#__popupModalMask__"+context.containerId).css("width", documentWidth);
			$("#__popupModalMask__"+context.containerId).css("background-color", "#000");
			
			$(window).resize(function()
			{
				var documentHeight = $(document).height();
				var documentWidth = $(document).width();
				$("#__popupModalMask__"+context.containerId).css("height", documentHeight);
				$("#__popupModalMask__"+context.containerId).css("width", documentWidth);
				
				if (context.centered)
				{
					context.centerPopup();
				}
			});
			
		}
		$("#__popupModalMask__"+context.containerId).css("display", "block");
		$("#__popupModalMask__"+context.containerId).css("opacity", "0.4");
	}
	
	
	var distroyModal = function()
	{
		$("#__popupModalMask__"+context.containerId).remove();
	}
	
	var hideModal = function()
	{
		$("#__popupModalMask__"+context.containerId).css("display","none");
	}	
	
	
	
	this.open = function()
	{
		if (this.modal)
		{
			createModalMask();
		}
		
		if($("#"+this.containerId).length>0)
		{
			$("#"+this.containerId).show();
		}
		else
		{
			//$("body").append('<div style="display:none;" id="'+this.containerId+'" >'+this.content+'</div>');
			$("body").append('<div style="display:block;" id="'+this.containerId+'" >'+this.content+'</div>');
		}
		
		$("#"+this.containerId).css("position", "absolute");
		$("#"+this.containerId).css("overflow", "auto");
		if (this.width>0)
		{
			$("#"+this.containerId).css("width", 	this.width+"px");
		}
		if (this.height>0)
		{
			$("#"+this.containerId).css("height", 	this.height+"px");
		}
		$("#"+this.containerId).css("top", 		this.y+"px");
		$("#"+this.containerId).css("left", 	this.x+"px");
		$("#"+this.containerId).css("display","block");
		
		
		if (this.centered)
		{
			context.centerPopup();
		}
		
		setTimeout(addDocumentClickHandler,100);

	}
	
	var addDocumentClickHandler	= function()
	{
		try
		{
			$(document).unbind("click",context.documentClickHandler);
		}catch(err){}
		$(document).bind("click",context.documentClickHandler);		
	}
	
	
	this.setPosition	= function(x,y)
	{
		this.x	= x;
		this.y	= y;
		$("#"+this.containerId).css("top", 		this.y+"px");
		$("#"+this.containerId).css("left", 	this.x+"px");
	}

	
	/**
	 * @return jquery object
	 */
	this.getElement	= function()
	{
		return $("#"+context.containerId);
	}
	
	
	this.setContent	= function(popupContent)
	{
		$("#"+context.containerId).html(popupContent);
		if (this.centered)
		{
			context.centerPopup();
		}
	}
	
	
	this.bindOpen	= function(bindElement,handlerType,optionalHandler)
	{		
		if (!handlerType)
		{
			handlerType	= "click";
		}
		openHandlers.push({element:bindElement,type:handlerType});
		$(bindElement).bind(handlerType, function(ev){
			
			context.openHandler(ev);
			if(optionalHandler)
			{
				optionalHandler(ev);
			}
		});
	}
	
	this.openHandler	= function(event)
	{
		var pos	= $(event.currentTarget).offset();
		event.preventDefault();
		event.stopPropagation();
		if (context.showUnder)
		{
			//console.log($(event.currentTarget).offset().left);
			context.x	= pos.left+context.dx;
			context.y	= pos.top + $(event.currentTarget).height()+context.dy;
		}
		else
		{
			context.x	= event.pageX+context.dx;
			context.y	= event.pageY+context.dy;
		}
		context.open();
	}

	this.closeHandler	= function(event)
	{
		event.preventDefault();
		event.stopPropagation();
		context.close(true);
	}
	
	this.bindClose	= function(bindElement,handlerType)
	{
		if (!handlerType)
		{
			handlerType	= "click";
		}
		closeHandlers.push({element:bindElement,type:handlerType});
		
		$(bindElement).live(handlerType,context.closeHandler);		
		
	}
	
	

	
	
	this.close = function(autoDestroy)
	{
		//$("#"+this.containerId).hide();
		$("#"+this.containerId).css("display","none");
		
		hideModal();
		
		if (autoDestroy)
		{
			this.destroy();
		}
	}
	
	
	this.destroy = function()
	{
		distroyModal();
		$("#"+this.containerId).remove();
	}
	
	
	this.documentClickHandler = function(event)
	{
		//if ($(event.target).attr("id") == context.containerId || $(event.target).parent().attr("id") == context.containerId)
		if ($(event.target).closest("#"+context.containerId).attr("id") == context.containerId)
		{
			return;
		}
		else if (context.closeOutside)
		{
			// elemente alternative la care nu se inchide
			// TODO -- de scris mai elegant si sa accepte si clase, nu doar id-uri
			for(var i=0;i<context.notClosingElements.length; i++)
			{
								
				var closestId			= $($(event.target).closest("#"+context.notClosingElements[i])[0]).attr("id");
				var parentElement 		= ($("#"+context.notClosingElements[i])[0].innerHTML)
				var childElement		= event.target.innerHTML;
				var childExistsInParent	= parentElement.indexOf(childElement) != -1;
				if (closestId == context.notClosingElements[i] || childExistsInParent)
				{
					return;
				}
			}
			context.closeHandler(event);
			$(document).unbind("click",context.documentClickHandler);			
		}
	}
	
}

Popup.lastId = 0;




function SearchSelectionDataGrid(settings)
{
	
	var collection 		= [];
	
	var context 		= this;
	
	var treeParentKey 	= "";
	var treeChildKey	= "";
	
	var fields			= settings && settings.fields != undefined ? settings.fields : [];
	
	var container		= null;
	var width			= settings && settings.width != undefined ? settings.width : 500;
	var height			= settings && settings.height != undefined ? settings.height : 500;
	var modal			= settings && settings.modal != undefined ? settings.modal : true;
	
	var selectHandler	= settings && settings.selectHandler != undefined ? settings.selectHandler : null;
	var searchHandler	= settings && settings.searchHandler != undefined ? settings.searchHandler : null;
	// cipri
	var openElement			= settings && settings.openElement != undefined ? settings.openElement : null;
	var targetValueField 	= settings && settings.targetValueField != undefined ? settings.targetValueField : null;
	var sourceValueKey 		= settings && settings.sourceValueKey != undefined ? settings.sourceValueKey : null;
	
	var operation		= settings && settings.operation != undefined ? settings.operation : "";
	
	var showAsPopup		= settings && settings.showAsPopup != undefined ? settings.showAsPopup : true;
	
	var popup			= null;
	
	var liveSearch		= settings && settings.liveSearch != undefined ? settings.liveSearch : false;
	
	
	this.init = function()
	{
		container = "searchSelectionDataGrid"+SearchSelectionDataGrid.containerCounter;
		SearchSelectionDataGrid.containerCounter++;
		// set click handler to open
		bindOpenElement();
	}
	
	
	var bindOpenElement	= function()
	{
		if (openElement)
		{
			// TODO -- nu face bind
			$(openElement).live("click",function(){context.open();});
			return;
		}
		console.log("ERROR: No open element defined!!!");
	}
	
	
	
	
	this.setCollection = function(value)
	{
		collection = value;
		
		$("#"+container+" #dataGrid tbody").empty();
		renderCollection();
		setupListClickListener();
	}
	
	
	this.getCollection = function()
	{
		return collection;
	}
	
	
	this.open = function()
	{
		createDataGrid();
		if (operation != "")
		{
			executeOperation(operation, "");
		}
		else
		{
			renderCollection();
			setupListClickListener();
		}
	}
	
	
	this.appendTo = function(appendTo)
	{
		var dgStr = createDataGrid();
		if (operation != "")
		{
			executeOperation(operation, "");
		}
		else
		{
			renderCollection();
			setupListClickListener();
		}
		
		
		$(appendTo).append(dgStr);
	}
	
	
	this.close = function()
	{
		if (popup)
		{
			popup.close(true);
		}
	}
	
	
	var executeOperation = function(operation, searchText)
	{
		var explode = operation.split(".");
		if (explode && explode.length == 2)
		{
			SystemRequest.load(explode[0],explode[1],[$("#"+container+" .inputText").val()],function(response){
				context.setCollection(response.data);
			},this);
		}
	}
	
	
	var createDataGrid = function()
	{
		var str = 
				"<div id='"+container+"' style='background-color:#fff;width:100%;height:100%;'>" +
					"<input name='inputText' class='inputText' style='width:"+(width-70)+"px;' />" +
					"<input name='inputSearch' class='inputSearch' value='Cauta' type='button' />" +
					"<br /><br />" +
					"<div style='overflow:auto;height:"+(height-75)+"px;' >" +
					"<table id='dataGrid' width='100%' cellspacing='0' cellpadding='0' border='0'  >" +
						"<thead>";
			var key 	= null;
			var length 	= fields.length;
			var widthTag;
			for (key in fields)
			{
				// width='"+(100 / length)+"'
				widthTag	= parseInt(fields[key]['width']) > 0 ? ' width="'+parseInt(fields[key]['width'])+'" ' : "";
				str += "<th "+widthTag+" style='border:1px dotted #ddd;background-color:#ccc;height:25px;'>"+fields[key]['label']+"</th>";
			}
			str += "</thead>" +
						"<tbody></tbody>" +
					"</table>" +
					"</div>" +
					(showAsPopup ? "<input name='inputClose' class='inputClose' type='button' value='Inchide fereastra' />" : "") +
				"</div>";
		
		if (showAsPopup)
		{
			popup = new Popup({content:str, width:width, height:height, closeOutside:false, modal:modal, centered:true});
			popup.open();
		}
		
		$("#"+container+" .inputSearch").die("click");
		$("#"+container+" .inputText").die("keypress");
		
		if (showAsPopup)
		{
			$("#"+container+" .inputClose").unbind("click");
		}
		
		$("#"+container+" .inputSearch").live("click",function(event){
			if (operation != "")
			{
				executeOperation(operation, $("#"+container+" .inputText").val());
			}
		});
		
		
		if (showAsPopup)
		{
			$("#"+container+" .inputClose").click(function(event){
				popup.close(true);
			});
		}
		
		$("#"+container+" .inputText").live("keypress",function(event){
			if ((event.keyCode == 13 || liveSearch) && operation != "")
			{
				executeOperation(operation, $("#searchSelectionDataGrid .inputText").val());
			}
		});
		return str;	
	}
	
	
	/* 
	 * Daca vede cineva acest comment, va rog sa-mi raspunda, la urmatoarea intrebare:
	 * 
	 * Ai o variabila privata numita `collection` la nivel de """"clasa"""" si ai aceeasi variabila la nivel de functie, 
	 * si in functia respectiva vrei sa te referi o data la variabila din clasa, o data la variabila locala. Cum faci? (Guess what...nici cum :) )
	 * 
	 * ...and the fuckin` thing doesn`t even have a brand logo...
	 * 
	 * */
	var renderCollection = function(collection_, marginLeft) 
	{
		var str 			= "";
		var collectionToUse = null;

		if (marginLeft == undefined)
		{
			marginLeft = 15;
		}
		
		if (collection_ != undefined && collection_ != null)
		{
			collectionToUse = collection_;
		}
		else
		{
			collectionToUse = collection;
		}
		
		
		if (collectionToUse && collectionToUse.length > 0)
		{
			var i 				= 0;
			var key 			= "";
			var obj 			= null;
			var length 			= fields.length;
			
			var objHasChildren 	= false;
			
			for (i=0; i<collectionToUse.length; i++)
			{
				var firstCol = true;
				obj = collectionToUse[i];
				
				if (obj.hasOwnProperty("__children__") && obj['__children__'] != null && obj['__children__'].length > 0)
				{
					objHasChildren = true;
				}
				else
				{
					objHasChildren = false;
				}
				
				str += "<tr'>";
					for (key in fields)
					{
						// width='"+(100 / length)+"'
						str += "<td valign='top' style='border:1px dotted #ccc;'>" +
								"<div "+(firstCol ? "style='margin-left:"+marginLeft+"px;" : "")+"'>" +
									(objHasChildren && firstCol ? "<img src='files_/folder_icon.jpg' />" : "") +
									"<a href='javascript:void(0);' idx='"+obj['id']+"'>"+obj[fields[key]['name']]+"</a>" +
								"</div>" +
								"</td>";
						firstCol = false;
					}
				str += "</tr>";
				
				$("#dataGrid tbody").append(str);
				str = "";
				if (objHasChildren)
				{
					renderCollection(obj['__children__'], marginLeft+30);
				}
			}
		}
	}
	

	var setupListClickListener = function()
	{
		$("#"+container+" a").click(function(event){
			
			var target 	= $(event.currentTarget);
			var id 		= target.attr("idx");
			var object = getObjectById(id, collection);
			
			if (selectHandler != null && selectHandler != undefined)
			{
				if (object)
				{
					selectHandler(object);
				}
			}
			else
			{
				$(targetValueField).val(object[sourceValueKey]);
			}
		});
	}
	
	
	var getObjectById = function(id, collection)
	{
		if (collection && collection.length > 0)
		{
			var i = 0;
			for (i=0; i<collection.length; i++)
			{
				if (collection[i]['id'] == id)
				{
					return collection[i];
				}
				
				if (collection[i].hasOwnProperty("__children__"))
				{
					res = getObjectById(id, collection[i]['__children__']);
					if (res != null)
					{
						return res;
					}
				}
			}
		}
		return null;
	}
	
	
	this.init();
	
}

SearchSelectionDataGrid.containerCounter = 0;

/**
 * 
 * END POPUP CONTROL
 *   
 *   
 */


/**
 * PAGINATION COMPONENT
*/

function PaginationComponent(container_, countHandler_, paginationClickHandler_, resultsStepCount_)
{
	var container					= container_;
	var countHandler				= countHandler_ ? countHandler_.split(".") : [];
	var paginationClickHandler		= paginationClickHandler_;
	var resultsStepCount			= resultsStepCount_;

	var context						= this;
	
	var currentPage					= 0;

	var init = function()
	{
		if (!countHandler || countHandler.length != 2)
		{
			console.log("invalid count handler!");
			return;
		}
	};

	
	this.resetCurrentPage = function()
	{
		currentPage = 0;
	}
	
	
	this.executeCountHandler = function(additionalParams)
	{
		SystemRequest.load(countHandler[0],countHandler[1],additionalParams,function(response){
			var numResults = parseInt(response.data);
			if (parseInt(response.data) > 0)
			{
				var numPages 	= Math.ceil(numResults / resultsStepCount);
				var i 			= 0;
				var str 		= "<b>"+numResults+"</b> de inregistrari gasite in <b>"+numPages+"</b> pagini. <b>"+resultsStepCount+"</b> rezultate pe pagina<br />";
				
				for (i=0;i<numPages;i++)
				{
					if (currentPage == i)
					{
						str += (i+1);
					}
					else
					{
						str += "<a href='javascript:void(0);' pag='"+i+"' class='PaginationLink'>"+(i+1)+"</a>";
					}
					str += " ";
				}
				
				$(container).css("text-align","center");
				$(container).html(str);
				
				$(".PaginationLink").unbind("click");
				$(".PaginationLink").click(function(event){
					currentPage = $(event.currentTarget).attr("pag");
					try
					{
						paginationClickHandler(currentPage * resultsStepCount);
					}
					catch(e)
					{
						console.log("Nu a fost specificat handler de click pentru paginare!");
					}
				});
			}
		}, context);
	}
	
	init();
	
}



