var PageManager = Class.create ();
PageManager.prototype = {
	initialize: function () {
		this.options = Object.extend ({
			Mian: false,
			Id: false,
			MainClassName: "Main",
			elementEffect: true,
			showMarkCheckBoxEffect: true,
			URL: false
		}, arguments[0] || {});

		if (this.options.URL) {
			this.options.URL = this.options.URL.replace ('&amp;', '&');
		}

		if (this.options.HTTP_REFERER) {
			this.options.HTTP_REFERER = this.options.HTTP_REFERER.replace ('&amp;', '&');
		}

		this.Main = $$(this.options.Main);
		this.Effect = new Array ();
		this.Style = new Array ();
		var Pointer = this;

		this.onOrderBy = this.OrderBy.bindAsEventListener (this);

		$$('div[class="image"]').each (function (element) {
			element.style.visibility = 'visible';
		});

		this.Main.each (function (element) {
			Pointer.Form = (Element.select (element, 'form[method="post"]')[0] ? Element.select (element, 'form[method="post"]')[0] : null);
			//Rico.Corner.round (element, {border: '#969b9d'});
			Element.select (element, 'th').each (function (element) {
				if (element.getWidth() < 48) {
					element.width= "48";
				}
			})
			Element.select (element, 'th[class="orderby"]').each (function (element) {
				Event.observe (element, 'click', this.onOrderBy);
				element.observe ('mouseover', function (event) {
					var e = element.select ($(document.body), 'contextmenu')[0];
					e.observe ('click', Event.stop);
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
			}.bindAsEventListener (this))

			Element.select (element, 'tr[class="light"],tr[class="dark"]').each (function (element) {
				Element.select (element, 'td').each (function (td) {
					Pointer.td = td;
					Element.select (td, 'a[class="action"]').each (function (a) {
						if (a.href) {
							Pointer.td.observe ('click', function (event) {
								Pointer._GoToUrl (event, a.href);
							});
						}
					})
				})
				element.observe ('click', function (event) {
					Pointer._MarkCheckBox (event, this);
				});
				if (Pointer.options.elementEffect) {
					element.observe ('mouseover', function (event) {
						Pointer._EffectMouseOwer (event, this);
					});
					element.observe ('mouseout', function (event) {
						Pointer._EffectMouseOut (event, this);
					});
				}
			})

			/*Element.select (element, 'input[type="checkbox"]').each (function (checkbox) {
				checkbox.observe ('click', function (event) {
					Pointer._ChecBox (event, this);
				});
			})*/

			Element.select (element, '[class="mark"]').each (function (element) {
				//Rico.Corner.round (element, {compact:true});
				element.observe ('click', function (event) {
					Pointer._MarkAllCheckBox (event);
				});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
			})
			Element.select (element, '[class="unmark"]').each (function (element) {
				//Rico.Corner.round (element, {compact:true});
				element.observe ('click', function (event) {
					Pointer._UnMarkAllCheckBox (event);
				});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
			})
			Element.select (element, 'select[class="marked"]').each (function (element) {
				element.observe ('change', function (event) {
					if (this.value)
						Pointer._Suubmit (event, this.value);
				});
			})

			Element.select (element, 'a[class="submit"]').each (function (element) {
				//Rico.Corner.round (element, {compact:true});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
				element.observe ('click', function (event) {
					Event.stop (event);
					Pointer._Suubmit (event, element);
				});
			})

			Element.select (element, 'a[class="deleteselected"]').each (function (element) {
				/*element.writeAttribute ('id', Pointer._UniqueID ());*/
				//Rico.Corner.round (element, {compact:true});
				element.observe ('click', function (event) {
					Event.stop (event);
					Pointer._Suubmit (event, this.href);
				});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
			})
			Element.select (element, '[class="paginate"]').each (function (element) {
				//Rico.Corner.round (element, {blend: false});
				Element.select (element, 'select[class="limit"]').each (function (limit) {
					limit.observe ('change', function (event) {
							if (this.value)
								Pointer._Limit (event, this.value);
					});
				})
				Element.select (element, 'input[class="limit"]').each (function (limit) {
					limit.observe ('change', function (event) {
							if (parseInt (this.value) == this.value && this.value > 0) {
								Pointer.LimitValue = this.value;
								Pointer._Limit (event, this.value);
							}
							else {
								this.value = '';
							}
					});
				})
			})
			Element.select (element, '[class="search"]').each (function (element) {
				//Rico.Corner.round (element, {blend: false});
				var submit_ = Element.select (element, 'input[class="submit"]')[0];
				if (submit_) {
					submit_.observe ('click', function (event) {
						var column = Element.select (element, 'select[class="column"]')[0];
						var clause = Element.select (element, 'input[class="clause"]')[0];
						if (column && column.value && clause && clause.value) {
							Pointer._Search (event, column.value, clause.value);
						}
	 				});
				}
				if (Element.select (element, 'input[class="reset"]')[0]) {
					var reset = Element.select (element, 'input[class="reset"]')[0];
					reset.observe ('click', function (event) {
						if (Pointer.options.HTTP_REFERER)
							Pointer._GoToUrl (event, Pointer.options.HTTP_REFERER);
					});
				}
			})

			Element.select (element, 'div[class="MainButton"]').each (function (element) {
				//Rico.Corner.round (element, {compact:true});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
				//element.observe ('click', function (event) {
					//Pointer._GoToUrl (event, element.href);
				//});
			})

			Element.select (element, 'a[class="MainButton"]').each (function (element) {
				//Rico.Corner.round (element, {compact:true});
				element.observe ('mouseover', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOwer (event, this);
					}
				});
				element.observe ('mouseout', function (event) {
					if (Pointer.options.elementEffect) {
						Pointer._EffectMouseOut (event, this);
					}
				});
				element.observe ('click', function (event) {
					Pointer._GoToUrl (event, element.href);
				});
			})

			/*Element.select (element, 'div[class="fieldset"]').each (function (element) {
				Rico.Corner.round (element);
			})*/
			Element.select (element, 'td[class="field"],td[class="value"]').each (function (element) {
				Pointer.td = element;
				Element.select (element, 'textarea[class="blob"]').each (function (textarea) {
					if (textarea.name) {
						Pointer._tinyMCE (textarea);
					}
				})
				Element.select (element, 'input[class="leave"]').each (function (input) {
					if ((Element.select (Pointer.td, 'textarea')[0])) {
						var textarea = (Element.select (Pointer.td, 'textarea'))[0];
						if (input.getAttribute ('maxlength') && textarea.value.length >=0 ) {
							textarea.value = textarea.value.slice (0, input.getAttribute ('maxlength')+1);
							input.value = parseInt (input.getAttribute ('maxlength') - textarea.value.length);
							textarea.observe ('keyup', function (event) {
								textarea.value = textarea.value.slice (0, input.getAttribute ('maxlength'));
								input.value = parseInt ((input.getAttribute ('maxlength') - this.value.length));
							});
						}
					}
				})

				Element.select (element, 'input[class="date"]').each (function (input) {
					if (input.next ('img').className == "date") {
						Pointer._RicoCalendar (input.next ('img'), input);
					}
					else if ((Element.select (Pointer.td, 'img')[0]) && (Element.select (Pointer.td, 'input')[0])) {
						var img = Element.select (Pointer.td, 'img')[0];
						var input = Element.select (Pointer.td, 'input')[0];
						Pointer._RicoCalendar (img, input);
					}
				})
				/*Element.select (element, 'div[class="validate"]').each (function (element) {
				 if (element.innerHTML && element.innerHTML.length) {
						if (Element.select (Pointer.td, 'textarea,input,select')) {
							var element = (Element.select (Pointer.td, 'textarea,input,select'))[0];
							if (element) {
								new Effect.Highlight (element, {startcolor: '#ff0000', endcolor: '#CED9E7', 
									afterFinish: function () {
										element.style.background = '#ffacb9';
									}
								});
							}
						}
					}
				})*/
			})
			Element.select (element, 'div[class="fckeditor"]').each (function (element) {
				element.style.background = Pointer.options.FCKCOLOR;
				Rico.Corner.round (element, {border: '#7f9db9', color: Pointer.options.FCKCOLOR});
			})
			element.cleanWhitespace ();
			//element.style.height = ($$('body')[0].getHeight () > document.viewport.getHeight () ? ($$('body')[0].getHeight ()-140)+"px" : (document.viewport.getHeight ()-140)+"px");
		}.bindAsEventListener (this));
		$$('div[class="eMain"]').each (function (element) {
			Rico.Corner.round (element);
		});
	},

	OrderBy: function (event) {
		if (Event.isLeftClick (event))
			this._GoToUrl (event, Element.select (Event.element (event), 'a[class="orderby"]')[0].href);
	},

	_UniqueID: function () {
		do {
			id = Math.random();
		}
		while (!$(id));
	return id;
	},

	_EffectMouseOwer: function (event, element) {

		if (element && !element.id) {
			element.writeAttribute ('id', 'element'+this._UniqueID() * 100000000000000000);
		}

		if (element) {
			if (element.id) {
				this.Style[element.id] = {
					'cursor' : (element.style.cursor ? element.style.cursor : false)
					/*, 'opacity' : (element.style.opacity ? element.style.opacity : false) */
				};
			}
			element.setStyle ({
				cursor: "pointer"
				/*, opacity: 0.75*/
			});
		}
	},

	_EffectMouseOut: function (event, element) {
		if (element && this.Style[element.id]) {
			element.setStyle ({
				cursor: (this.Style[element.id]['cursor'] ? this.Style[element.id]['cursor'] : "default"),
				/*opacity: (this.Style[element.id]['opacity'] ? this.Style[element.id]['opacity'] : 1),*/
				borderBottom: (this.Style[element.id]['borderBottom'] ? this.Style[element.id]['borderBottom'] : "none")
			});
		}
	},

	_ChecBox: function (event, element) {
		if (element.checked == true)
			element.checked = false;
		else
			element.checked = true;
	},

	_MarkCheckBox: function (event, element) {
		var Pointer = this;
		Element.select (element, 'td').each (function (td) {
			Element.select (td, 'input[type="checkbox"]').each (function (checkbox) {
				Pointer._ChecBox (event, checkbox);
			})
		})
	},

	_MarkAllCheckBox: function (event) {
		$$('tr[class="light"],tr[class="dark"]').each (function (tr) {
			Element.select (tr, 'td').each (function (td) {
				Element.select (td, 'input[type="checkbox"]').each (function (checkbox) {
					checkbox.checked = true;
				})
			})
		})
	},

	_UnMarkAllCheckBox: function (event) {
		$$('tr[class="light"],tr[class="dark"]').each (function (tr) {
			Element.select (tr, 'td').each (function (td) {
				Element.select (td, 'input[type="checkbox"]').each (function (checkbox) {
					checkbox.checked = false;
				})
			})
		})
	},

	_GoToUrl: function (event, url) {
		var Query = (url.toQueryParams());
		if (Query.cmd == 'delete' || Query.mode == 'imagesdelete') {
			if (confirm ('Usunąć?')) {
				parent.location.href = url;
			}
			else {
				Event.stop (event);
			}
		}
		else {
			parent.location.href = url;
		}
	},

	_Suubmit: function (event, value) {
		$$ ('input','textarea','select').each (function (element) {
			if (element.disabled == true) {
				element.name = '#disabled#';
			}
		})
		if (Event.element(event).href && this.Form) {
			var cmdDelExp = new RegExp ('delete', 'i');
			if (Event.element(event).href.match (cmdDelExp)) {
				if (confirm ("Usunąć")) {
					var form = this._GetForm(event);
					document.forms[form.id].action = Event.element(event).href;
					document.forms[form.id].submit ();
				}
			}
			else {
				var form = this._GetForm(event);
				document.forms[form.id].action = Event.element(event).href;
				document.forms[form.id].submit ();
			}
		}
		else if (value) {
			var cmdDelExp = new RegExp ('delete', 'i');
			if (value.match (cmdDelExp)) {
				if (confirm ("Usunąć")) {
					var form = this._GetForm(event);
					document.forms[form.id].action = value;
					document.forms[form.id].submit ();
				}
			}
			else {
				var form = this._GetForm(event);
				document.forms[form.id].action = value;
				document.forms[form.id].submit ();
			}
		}
	return false;
	},

	_GetForm: function (event) {
		var element = Event.element(event);
		var i = 0;
		while (!element.up(i).action) {
			i++;
		}
	return element.up(i);
	},

	_Limit: function (event, value) {
		if (this.options.URL && value) {
			var REG = new RegExp ('&limit=(.*)', 'i');
			if (this.options.URL.match (REG)) {
				this._GoToUrl (event, this.options.URL.replace (REG, '&limit='+value).replace ('&amp;', '&'));
			}
			else {
				this._GoToUrl (event, this.options.URL.replace ('&amp;', '&')+"&limit="+value);
			}
		}
	},

	_Search: function (event, column, clause) {
		if (this.options.URL && column && clause) {
			var cmdRegExp = new RegExp ('&cmd=(.*)', 'i');
			var columnRegExp = new RegExp ('&column=(.*)', 'i');
			var clauseRegExp = new RegExp ('&clause=(.*)', 'i');
			var url = this.options.URL.replace (cmdRegExp, '&cmd=search');
			if (url.match (columnRegExp))
				url = url.replace (columnRegExp, '&column='+column);
			else
				url = url+"&column="+column;

			if (url.match (clauseRegExp))
				url = url.replace (clauseRegExp, '&clause='+clause);
			else
				url = url+"&clause="+clause;
			if (url)
				this._GoToUrl (event, url);
		}
	},

	_FCKeditor: function (parent, element) {
		var oFCKeditor      = new FCKeditor (element.name);
		oFCKeditor.Value    = (element.value ? element.value : '<br />');
		oFCKeditor.Width	  = (element.getWidth () ? element.getWidth ()-4 : '600');
		oFCKeditor.Height 	= (element.getHeight () ? element.getHeight ()*2 : '300');
		oFCKeditor.BasePath	= this.options.HOST+'fckeditor/';
		oFCKeditor.ToolbarSet = "Basic";
		if (this.options.FCKSKIN) {
			switch (this.options.FCKSKIN) {
				default:
					oFCKeditor.Config['SkinPath'] = this.options.HOST+'fckeditor/editor/skins/default/';
					this.options.FCKCOLOR = '#EFEFDE';
				break;
				case 'office2003':
					oFCKeditor.Config['SkinPath'] = this.options.HOST+'fckeditor/editor/skins/office2003/';
					this.options.FCKCOLOR = '#F7F8FD';
				break;
				case 'silver':
					oFCKeditor.Config['SkinPath'] = this.options.HOST+'fckeditor/editor/skins/silver/';
					this.options.FCKCOLOR = '#F7F7F7';
				break;
			}
		}
		element.remove ();
		var innerHTML = parent.innerHTML;
		parent.innerHTML = '';
		Element.insert (parent, '<div class="fckeditor" style="width:'+parseInt (oFCKeditor.Width +4)+'px; height="'+parseInt (oFCKeditor.Height+4)+'px">'+oFCKeditor.CreateHtml ()+'</div><br />'+innerHTML);
	},

	_tinyMCE: function (element) {
		try {
			if (tinyMCE && element) {
				tinyMCE.init ({
					mode : "exact",
					elements : element.name,
					theme : "advanced",
					plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups",
					fullpage_fontsizes : '13px,14px,15px,18pt,xx-large',
					fullpage_default_xml_pi : false,
					fullpage_default_langcode : 'en',
					fullpage_default_title : "Messange",
					theme_advanced_actions1 : "undo,redo,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect",
					theme_advanced_actions2 : "forecolor,|,bullist,numlist,|,outdent,indent,blockquote,|,sub,sup,|,insertdate,inserttime,|,removeformat,visualaid,|,charmap,emotions,iespell,advhr,|,fullscreen,preview,code",
					theme_advanced_actions3 : "",
					theme_advanced_actions4 : "",
					theme_advanced_toolbar_location : "top",
					theme_advanced_toolbar_align : "left",
					theme_advanced_statusbar_location : "bottom",
					theme_advanced_resizing : true,
					content_css : "css/word.css",
					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"
				});
			}
		}
		catch (error) {
			alert ("No such element or module\n"+error);
		}
	},

	_RicoCalendar: function (element, input) {
		var Calendar = new Rico.CalendarControl ("Calendar", {showWeekNumber:1});
		Calendar.atLoad ();
		Calendar.returnValue = function (value) {input.value = value;};
		element.observe ('click', function (event) {
			if (Element.visible (Calendar.container)) {
				Calendar.close ();
			}
			else {
				RicoUtil.positionCtlOverIcon (Calendar.container, this);
				Calendar.open ();
			}
		Event.stop(event);
		});
	}
};