(function () {
	var WebForge = this.WebForge = {
			version: '0.4',
			start_date: '2011-08-26 18:15:00',
			mootools: (typeof(this.Mootools) == 'object' ? true : false),
			body_id: 'forge_body',
			
			js_url: '/forge/jsLoad.php?',
			css_url: '/forge/cssLoad.php?',
			traffic_url: '/forge_traffic/'
	};
	
	window.addEvent('domready', function () {
		if (document.body) { document.body.id = WebForge.body_id; }
		if (!document.body.getElement) { document.body.getElement = function (exp) { return document.id(Slick.find(this, exp)); }; }
	});
	
	var bodyID = this.bodyID = function () { return $(document.body.id); }
	
	var browserType = this.browserType = function () {
		var ua = navigator.userAgent;
		var names = ['opera','webkit','ie','gecko'];
		var agents = {}
			agents['opera'] = (window['opera'] && opera.buildNumber);
			agents['webkit'] = ((/WebKit/).test(ua) || ((/WebKit/).test(ua) && !window.getSelection().getRangeAt));
			agents['ie'] = (!agents.opera && !agents.webkit && (/MSIE/gi).test(ua) && (/Explorer/gi).test(navigator.appName));
			agents['gecko'] = (!agents.webkit && (/Gecko/).test(ua));
		
		r = Object.keyOf(agents,true);
		
		return (r !== false ? r : 'unknown');
	};
	
	var isElement = this.isElement = function (el) { if (typeOf(el) == "string") { el = (el.length > 0 ? $(el) : null); if (typeOf(el) != "element") { el = null; } } else if (typeOf(el) != "element") { el = null; } return el; };
	
	var killElement = this.killElement = function (el) { if (typeOf(el) == "string") { el = (el.length > 0 ? $(el) : null); if (typeOf(el) != "element") { el = null; } } else if (typeOf(el) != "element") { el = null; } if (typeOf(el) == "element") { el.destroy(); } };
	
	var setTrait = this.setTrait = function (el,i,v) { el = isElement(el); if (typeOf(el) == "element") { i = (typeOf(i) == "string" ? i : ''); if (i.length > 0) { if (typeOf(el.setProperty) == "undefined") { el.setAttribute(i,v); } else { el.setProperty(i,v); } } } };
	
	var isPercent = this.isPercent = function (s) { var r = false; if (typeOf(s) == "string") { if (s.length > 1) { var p = s.substr((s.length)-1); if (p == '%') { s = s.substr(0,(s.length-2)); s = s.toInt(); if (s > -1 && s < 101) { r = true; } } } } return r; };
	
	var dimension = this.dimension = function (n,opts) { n = (['string','number'].contains(typeOf(n)) ? n : ''); opts = Object.filter(opts,function (v,k) { v = (typeOf(v) == "number" ? v : 0); return [0,1].contains(v); }); opts['d'] = (opts['d'] ? 0 : ''); if (n.length > 0) { if (!isPercent(n)) { n = (typeOf(n.toInt()) == "number" ? n.toInt() : opts.d); if (opts['t']) { n = (n.length == 0 ? "0px" : n+'px'); } } } else { n = opts.d; } return n; };
	
	var zIndex = this.zIndex = function (el) { var z = 0; var t = 0; el = isElement(el); if (typeOf(el) != "element") { el = $(WebForge.body_id); } var els = el.getElements('*'); for (var i = 0; i < els.length; i++) { if (typeOf(els[i]) == "element") { test = els[i].getStyle('zIndex'); test = (typeOf(test) == "string" ? test : ''); if (test.length > 0) { test = Number.from(test); if (test > 0) { z = (test > z ? (test+1) : z); } } } } return z; };
	
	var alterVars = this.alterVars = function (obj,opt,d) {
			var a;
				opt = (typeOf(opt) == "string" ? opt : '');
				opt = (['text','obj'].contains(opt) ? opt : '');
			
			switch (opt) {
			case 'text':
				a = function (obj,d) {
						obj = (typeOf(obj) == "object" ? obj : {});
						obj = Object.filter(obj,function(v,k) { return ['string','number','array'].contains(typeOf(v)); });
						obj = Object.map(obj,function(v,k) {
									switch (typeOf(v)) {
									case 'string':
										v = v.replace(/[^a-zA-Z0-9-_,.]/gi,'');
										break;
									case 'array':
										for (var i = 0; i < v.length; i++) {
											v[i] = v[i].replace(/[^a-zA-Z0-9-_,.]/gi,'');
										}
										break;
									}
									return v;
							});
						d = (typeOf(d) == "string" ? d : '|');
						d = (['|','/'].contains(d) ? d : '|');
						
						var v = ''; var k = Object.keys(obj);
						
						if (k.length > 0) {
							for (var i = 0; i < k.length; i++) {
								if (typeOf(obj[k[i]]) == "array") { obj[k[i]] = obj[k[i]].join(':'); }
								v += (obj[k[i]].length > 0 ? k[i]+':'+obj[k[i]] : k[i])+d;
							}
						}
						return v;
				};
				break;
			case 'obj':
				a = function (obj,d) {
						d = (typeOf(d) == "string" ? d : '|');
						d = (['|','/'].contains(d) ? d : '|');
						obj = (typeOf(obj) == "string" ? obj : '');
						obj = (obj.length > 0 ? obj.split(d) : []);
						
						var v = {}; var t; var k = ''; var r;
						
						if (obj.length > 0) {
							for (var i = 0; i < obj.length; i++) {
								if (obj[i].length > 0) {
									t = obj[i].split(':');
									k = t[0].replace(/[^a-zA-Z]/gi,'');
									if (k.length > 0) {
										r = (t.length > 1 ? t.filter(function(v,i) { return i > 0; }) : '');
										if (typeOf(r) == 'array') {
											if (r.length == 1) {
												r = r[0].replace(/[^a-zA-Z]/gi,'');
											} else {
												r = r.map(function(v,i) { return v.replace(/[^a-zA-Z]/gi,''); });
											}
										}
										
										v[k] = r;
									}
								}
							}
						}
						
						return v;
				};
				break;
			}
			
			return (typeOf(a) == "function" ? a(obj,d) : null);
	};
	
	var loadDialog = this.loadDialog = function (n,opts) {
			n = (typeOf(n) == "string" ? n : '');
			n = (n.length > 0 ? n : '');
			n = (n.search(/[a-zA-Z][a-zA-Z0-9_-]*/i) > -1 ? n : '');
			opts = (typeOf(opts) == "object" ? Object.filter(opts, function (v,k) { return ['string','number'].contains(typeOf(v)); }) : {});
			
			if (n.length > 0) {
				var spin = new Element('img',{ id: 'window-spin', src: '/x/spinner.gif', title: 'Loading...' });
					spin.addClass('ajax-loading');
					spin.inject(document.body,'bottom');
					
				var os = {};
					os['n'] = n;
					os['w'] = (opts['w'] ? dimension(opts['w'],{}) : '');
					os['h'] = (opts['h'] ? dimension(opts['h'],{}) : '');
					os['title'] = (typeOf(opts['title']) == "string" ? opts['title'] : '');
					os['url'] = (typeOf(opts['url']) == "string" ? opts['url'] : '');
					os['js'] = (typeOf(opts['js']) == "string" ? opts['js'] : '');
					os['css'] = (typeOf(opts['css']) == "string" ? opts['css'] : '');
				
				os = Object.filter(os, function (v,k) { var t = (typeOf(v) == "number" ? "-" : v); return t.length > 0; });
				os = Object.map(os, function (v,k) { return encodeURIComponent(v); });
				
				var sid = String.uniqueID();
				var h = document.getElementsByTagName('head')[0];
				var s = new Element('script',{ id: sid, type: 'text/javascript', src: '/forge/tools/window.php?sid='+sid+'&'+Object.toQueryString(os) });
					s.inject(h,'bottom');
			}
	};
	
	var loadScript = this.loadScript = function (n,t,opts) {
			n = (typeOf(n) == "string" ? n : '');
			t = (typeOf(t) == "string" ? t : '');
			t = (['js','css'].contains(t) ? t : '');
			opts = (typeOf(opts) == "object" ? Object.filter(opts, function (v,k) { return ['string','number','element'].contains(typeOf(v)); }) : {});
			
			if (n.length > 0 && t.length > 0) {
				var go = false;
				var uid = (typeOf(opts['id']) == "string" ? opts['id'] : '');
				var loaded = (typeOf(opts['loaded']) == "string" ? opts['loaded'] : '');
					
				if (typeOf(loaded) == "string") {
					var tries = (typeOf(opts['tries']) == "number" ? opts['tries'] : 0);
					
					if (typeOf($(loaded)) == "element") {
						go = true;
					} else {
						if (tries < 451) {
							opts.tries++;
							window.setTimeout(function (n,t,opts) { loadScript(n,t,opts); },200,n,t,opts);
						}
					}
				} else {
					go = true;
				}
				
				if (go) {
					var sid = (uid.length > 0 ? uid : String.uniqueID());
					var h = document.getElementsByTagName('head')[0];
					var s;
					
					switch (t) {
					case "js":
						s = new Element('script',{ id: sid, type: 'text/javascript', src: n });
						break;
					case "css":
						s = new Element('link',{ id: sid, rel: 'stylesheet', type: 'text/css', href: n });
						break;
					}
					
					s.inject(h,'bottom');
				}
			}
	};
	
	var Transfer = this.Transfer = new Class({
			Extends: Request,
			
			settings: {
				setup: false,
				timeout: 30,
				tries: { service: 0, gateway: 0, timeout: 0 },
				error: { msg: '', target: null, where: 'bottom', basic: false },
				spinner: { el: null, target: null, where: 'before', z: null },
				js: { id: '', url: '' }
			},
			
			initialize: function (opts) {
				if (typeOf(opts) == "object") {
					var url = (opts['url'] ? opts['url'] : '');
						url = (typeOf(url) == "string" ? url : '');
					
					if (url.length > 0) {
						this.options.url = WebForge.traffic_url+'process/'+url;
						
						// HTML Element to Update/Append to
						var update = (opts['update'] ? opts.update : null);
						var append = (opts['append'] ? opts.append : false);
							append = (typeOf(append) == "boolean" ? append : false);
						
							if (typeOf(update) == "element") {
								if (append) {
									this.options.append = update;
								} else {
									this.options.update = update;
								}
								
								this.options.url = WebForge.traffic_url+'deliver/'+url;
								
								// JS to load, if any
								var js = (opts['js'] ? opts.js : '');
									js = (typeOf(js) == "string" ? js : '');
									
								if (js.length > 0) {
									this.settings.js.url = js;
									
									var jsid = (opts['jsid'] ? opts.jsid : '');
										jsid = (typeOf(jsid) == "string" ? jsid : '');
										
									if (jsid.length > 0) {
										this.settings.js.id = jsid;
									}
								}
								
								this.success = function(text){
									var options = this.options, response = this.response;
									
									response.html = text.stripScripts(function(script){
										response.javascript = script;
									});
									
									var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
									if (match) response.html = match[1];
									var temp = new Element('div').set('html', response.html);
									
									response.tree = temp.childNodes;
									response.elements = temp.getElements('*');
									
									if (options.filter) response.tree = response.elements.filter(options.filter);
									if (options.update) document.id(options.update).empty().set('html', response.html);
									else if (options.append) document.id(options.append).adopt(temp.getChildren());
									if (options.evalScripts) Browser.exec(response.javascript);
									
									this.onSuccess(response.tree, response.elements, response.html, response.javascript);
								};
							}
						
						// FORM DATA
						var data = (opts['data'] ? opts.data : '');
							data = (typeOf(data) == "string" ? data : '');
							this.options.data = data;
						
						// TIMEOUT (in seconds)
						if (opts['timeout']) { this.settings.timeout = this.set_timeout(opts.timeout); }
						
						// ERROR MESSAGE setup
						var error = { msg: '', target: null, where: 'bottom', z: null };
							error.target = (opts['error'] ? opts.error : null);
								if (typeOf(error.target) == "string") {
									error.target = (typeOf($(error.target)) ? $(error.target) : null);
								} else if (typeOf(error.target) != "element") {
									error.target = null;
								}
								if (typeOf(error.target) == "element") {
									error.where = (opts['etarget'] ? opts.etarget : '');
									error.where = (typeOf(error.where) == "string" ? error.where : '');
									error.where = (['before','after','top','bottom','alert'].contains(error.where) ? error.where : 'bottom');
								} else {
									error.target = document.body;
									error.where = 'bottom';
									error.basic = true;
								}
							this.settings.error = error;
						
						// SPINNER setup
						var spin = { el: null, target: null, where: 'before', z: null };
							spin.target = (opts['spin'] ? opts.spin : null);
								if (typeOf(spin.target) == "string") {
									spin.target = (typeOf($(spin.target)) ? $(spin.target) : null);
								} else if (typeOf(spin.target) != "element") {
									spin.target = null;
								}
								if (typeOf(spin.target) == "element") {
									spin.where = (opts['starget'] ? opts.starget : '');
									spin.where = (typeOf(spin.where) == "string" ? spin.where : '');
									spin.where = (['before','after','top','bottom'].contains(spin.where) ? spin.where : 'before');
								} else {
									spin.target = document.body;
									spin.where = 'bottom';
									spin.z = zIndex(document.body);
								}
							this.settings.spinner = spin;
					}
					
					this.options.method = 'post';
					this.options.timeout = (this.set_timeout(this.settings.timeout)*1000);
					if (typeOf(this.options.update) == "element") {
						this.options.evalScripts = true;
					} else {
						this.options.evalResponse = true;
					}
					if (typeOf(this.options.update) == "element") { this.options.link = 'cancel'; }
					this.options.noCache = true;
					this.options.onCancel = this.default_events('cancel');
					this.options.onException = this.default_events('exception');
					this.options.onFailure = this.default_events('failure');
					this.options.onTimeout = this.default_events('timeout');
					this.options.onSuccess = this.default_events('success');
					
					this.parent(this.options);
					
					this.settings.setup = true;
				} else {
					this.settings.setup = false;
				}
			},
			
			set_timeout: function (t) {
				t = (['number','string'].contains(typeOf(t)) ? t : 0);
				t = (typeOf(t) == "string" ? t.toInt() : t);
				t = (typeOf(t) == "number" ? t : 0);
				t = (t > 0 ? t : 30);
				t = (t > 120 ? 120 : t);
				return t;
			},
			
			default_events: function (opt) {
				var e;
				opt = (typeOf(opt) == "string" ? opt : '');
				opt = (['cancel','exception','failure','timeout','success'].contains(opt) ? opt : '');
				
				switch (opt) {
				case "cancel":
					e = function() {
							if (typeOf(this.settings.spinner.el) == "element") { this.settings.spinner.el.destroy(); }
						};
					break;
				case "exception":
					e = function (h,v) {
							if (typeOf(this.settings.spinner.el) == "element") { this.settings.spinner.el.destroy(); }
							this.error_msg(h+": "+v);
						};
					break;
				case "failure":
					e = function (xhr) {
							this.status_result(xhr.status,'failure');
						};
					break;
				case "timeout":
					e = function () {
							this.status_result(408,'timeout');
						};
					break;
				case "success":
					e = function () {
							if (typeOf(this.settings.spinner.el) == "element") { this.settings.spinner.el.destroy(); }
							if (this.settings.js.url.length > 0) { loadScript(this.settings.js.url,'js',{ id: this.settings.js.id }); }
						};
					break;
				}
				
				return e;
			},
			
			spinner: function () {
				var s = new Element('img',{ id: String.uniqueID(), src: '/x/spinner.gif', title: 'Loading...' });
					s.addClass('ajax-loading');
				return s;
			},
			
			start: function (opts) {
				this.initialize(opts);
				
				if (this.settings.setup && this.options.url.length > 0) {
					var s = this.spinner();
						if (typeOf(this.settings.spinner.z) != "null") {
							s.setStyle('zIndex',this.settings.spinner.z);
							s.setStyles({
								position: 'fixed',
								bottom: '3px',
								right: '3px'
							});
						}
						s.inject(this.settings.spinner.target,this.settings.spinner.where);
						this.settings.spinner.el = s;
					
					this.send();
				}
			},
			
			status_result: function (c,et) {
				et = (typeOf(et) == "string" ? et : '');
				et = (['failure','timeout'].contains(et) ? et : 'Process');
				et = et.capitalize();
				c = (typeOf(c) == "number" ? c : -1);
				
				var e = '', k = false, r = false;
				var tries = this.settings.tries;
				
				switch(c) {
				case 400:
					e = 'Unable to communicate with the server.',k = true;
					break;
				case 401:
					e = 'Unauthorized access',k = true;
					break;
				case 403:
					e = 'Request forbidden by the server',k = true;
					break;
				case 404:
					e = 'Requested file not found',k = true;
					break;
				case 405:
					e = 'Request was denied',k = true;
					break;
				case 406:
					e = 'Invalid request format',k = true;
					break;
				case 407:
					e = 'Unauthorized access',k = true;
					break;
				case 408:
					tries.timeout = this.settings.tries.timeout = tries.timeout+1;
					if (tries.timeout < 3) {
						e = 'Request timed out.. Attempt '+tries.timeout+' out of 3',r = true;
					} else {
						e = 'Request failed after three timeout attempts',k = true;
					}
					break;
				case 409:
					e = 'Failed due to a conflict',k = true;
					break;
				case 410:
					e = 'Resource does not exist',k = true;
					break;
				case 411:
					e = 'Incomplete request',k = true;
					break;
				case 412:
					e = 'A process failed',k = true;
					break;
				case 413:
					e = 'Request exceeded size limit',k = true;
					break;
				case 414:
					e = 'Request address too long',k = true;
					break;
				case 415:
					e = 'Unsupported request',k = true;
					break;
				case 416:
					e = 'Invalid request',k = true;
					break;
				case 417:
					e = 'Request failed to meet requirements',k = true;
					break;
				case 500:
					e = 'Internal server error occured',k = true;
					break;
				case 501:
					e = 'Request not supported',k = true;
					break;
				case 502:
					e = 'Invalid response from the server',k = true;
					break;
				case 503:
					tries.service = this.settings.tries.service = tries.service+1;
					if (tries.service < 3) {
						e = 'Service unavailable.. Attempt '+tries.service+' out of 3',r = true;
					} else {
						e = 'Request failed after three service attempts',k = true;
					}
					break;
				case 504:
					tries.gateway = this.settings.tries.gateway = tries.gateay+1;
					if (tries.gateway < 3) {
						e = 'Gateway timed out.. Attempt '+tries.timeout+' out of 3',r = true;
					} else {
						e = 'Request failed after three gateway attempts',k = true;
					}
					break;
				case 505:
					e = 'Unable to complete the request',k = true;
					break;
				default:
					e = 'An unkown error occured',k = true;
				}
				
				this.error_message('<strong>'+et+' Error</strong>: '+e);
				
				// Kill the spinner?
				if (k) {
					if (typeOf(this.settings.spinner.el) == "element") {
						this.settings.spinner.el.destroy();
						this.settings.spinner.el = null;
					}
				}
				
				// Retry?
				if (r) { this.send(); }
			},
			
			error_message: function (e) {
				e = (typeOf(e) == "string" ? e : '');
				var el;
				var basic = $('transfer-error');
				
				if (e.length > 0) {
					if (this.settings.error.where == 'alert') {
						e = e.replace(/\<[^>]+\>/gi,'');
						alert(e);
					} else {
						if (this.settings.error.basic) {
							if (typeOf(basic) == "element") { basic.destroy(); }
							el = new Element('div',{ id: 'transfer-error', html: e });
							el.addEvent('mouseover', function () { this.style.cursor = 'pointer'; });
							el.addEvent('click', function () { this.destroy(); });
							el.inject(document.body,'bottom');
						} else {
							if (typeOf(this.settings.error.target) != "element") {
								if (typeOf(basic) == "element") { basic.destroy(); }
								el = new Element('div',{ id: 'transfer-error', html: e });
								el.addEvent('mouseover', function () { this.style.cursor = 'pointer'; });
								el.addEvent('click', function () { this.destroy(); });
								el.inject(document.body,'bottom');
							} else {
								el = new Element('div', { html: e });
								el.addClass('wf_transfer_error');
								el.addEvent('mouseover', function () { this.style.cursor = 'pointer'; });
								el.addEvent('click', function () { this.destroy(); });
								el.inject(this.settings.error.target,this.settings.error.where);
							}
						}
					}
				}
			}
	});
	
	Element.Properties.deliver = {
		set: function (options) {
			var load = this.get('deliver').cancel();
				load.initialize(options);
			return this;
		},
		
		get: function () {
			var load = this.retrieve('deliver');
			if (!load) {
				load = new Transfer();
				this.store('deliver',load);
			}
			return load;
		}
	};
	
	Element.implement({ deliver: function () { this.get('deliver').start(Object.append({data: this, update: this, error: this, spin: this },Array.link(arguments, {data: Type.isObject, url: Type.isString}))); return this; } });
	
	var Forms = this.Forms = new Class({
			setup: function (el,o) {
				el = isElement(el);
				
				if (typeOf(el) == "element") {
					if (el.get('tag') == "form") {
						var submit = el.getElement('input[type="submit"]');
							if (typeOf(submit) != "element") {
								submit = el.getElement('input[type="button"][name="submit"]');
							}
						
						if (typeOf(submit) == "element") {
							// JS-provided options..
							//(convert to string & then back to weed out invalid)
							if (typeOf(o) == "object") {
								o = alterVars(o,'text','|');
								o = alterVars(o,'obj','|');
							} else {
								o = {};
							}
							
							// Form-provided options (via 'name' attribute)
							var opts = el.getProperty('name');
								opts = (typeOf(opts) == 'string' ? alterVars(opts,'obj','|') : {});
								
							// Merge the options..
							Object.append(o,opts);
							
							var options = alterVars(o,'text','|');
								options = (typeOf(options) == "string" ? options : '');
							
							submit.set('name','submit|'+options);
							submit.addEvent('click',function (event) {
								event.stop();
								
								var err = '';
								var form = this.getParent('form');
								
								if (typeOf(form) == "element") {
									var action = form.getProperty('action');
										action = (typeOf(action) == "string" ? action : '');
									
									// Editor Content? (using CKEDITOR)
									var editors = form.getElements('input[type="hidden"][title="forge-editor"][name][id]');
									
									Array.each(editors,function (el) {
										var id = el.getProperty('id');
										
										if (typeOf(CKEDITOR.instances[id]) != "null") {
											el.setProperty('value',CKEDITOR.instances[id].getData());
										}
									});
									
									if (action.length > 0) {
										var query = Forms.query(form,'str');
										if (query.length > 0) {
											this.set('id',String.uniqueID());
											
											// Remove error messages..
											var e_msg = form.getElements('div.wf_transfer_error');
												if (e_msg.length > 0) {
													Array.each(e_msg,function (msg) { msg.destroy(); });
												}
											
											// Remove success messages..
											var s_msg = form.getElements('div.success_msg');
												if (s_msg.length > 0) {
													Array.each(s_msg,function (msg) { msg.destroy(); });
												}
											
											var opts = alterVars(this.get('name'),'obj','|');
											
											var settings = { url: action, data: query, spin: this, error: form };
												if (typeOf(opts) == "object") {
													if (typeOf(opts.spin) == 'string') { settings.spin = opts.spin; }
													if (typeOf(opts.starget) == 'string') { settings.starget = opts.starget; }
													if (typeOf(opts.alert) == 'string') { settings.etarget = 'alert'; }
												}
												
											// Process form..
											var process = new Transfer().start(settings);
										} else {
											err = "The submitted form contains no data.";
										}
									} else {
										err = "This form is not properly setup.";
									}
								} else {
									err = "Invalid or incomplete form was submitted.";
								}
								
								if (err.length > 0) {
									alert(err);
								}
							});
						}
					}
				}
			},
			
			editor: function (el,opts) {
				opts = (typeOf(opts) == "object" ? opts : {});
				el = isElement(el);
				
				if (typeOf(el) == "element" && typeOf(CKEDITOR) != "null") {
					if (el.get('tag') == "input") {
						var t = el.getProperty('type');
							t = (typeOf(t) == "string" ? t : '');
						var n = el.getProperty('name');
							n = (typeOf(n) == "string" ? n : '');
						var id = el.getProperty('id');
							id = (typeOf(id) == "string" ? id : '');
						
						if (t == 'hidden' && n.length > 0 && id.length > 0) {
							el.setProperty('title','forge-editor');
							
							if (typeOf(CKEDITOR.instances[id]) != "null") { delete CKEDITOR.instances[id]; }
							
							var page = (typeOf(opts['page']) == "number" ? 1 : 0);
							
							if (page == 0) {
								CKEDITOR.replace(id,{ toolbar: [
											{ name: 'basic', items: ['Bold','Italic','Underline','Subscript','Superscript','-','NumberedList','BulletedList','-','Link','Unlink','-','Image'] }
										]
									});
							} else {
								CKEDITOR.replace(id,{ resize_maxWidth: '786px', toolbar: [
											{ name: 'history', items: ['Undo','Redo'] },
											{ name: 'cutcopy', items: ['Cut','Copy','PasteText','PasteFromWord'] },
											{ name: 'basic', items: ['Bold','Italic','Underline','Subscript','Superscript','-','NumberedList','BulletedList','-','Link','Unlink','-','Image','Table','HorizontalRule'] },
											{ name: 'styles', items: ['FontSize','TextColor','BGColor'] },
											{ name: 'search', items: ['Find','Replace'] },
											{ name: 'max', items: ['SpellChecker','-','Maximize'] }
										]
									});
							}
							
							var v = el.getProperty('value');
								v = (typeOf(v) == "string" ? v : '');
								
							if (v.length > 0) {
								CKEDITOR.instances[id].setData(v);
							}
						}
					}
				}
			},
			
			query: function (el,opt) {
				var ql = [];
				el = isElement(el);
				opt = (typeOf(opt) == "string" ? opt : 'str');
				opt = (['str','list'].contains(opt) ? opt : 'str');
				
				if (typeOf(el) == "element") {
					if (el.get('tag') == "form") {
						// Gather form elements..
						var els = el.getElements('input[type="hidden"][name]');
							els = els.append(el.getElements('input[type="password"][name]'));
							els = els.append(el.getElements('input[type="text"][name]'));
							els = els.append(el.getElements('input[type="radio"][name][checked="true"]'));
							els = els.append(el.getElements('input[type="checkbox"][name][checked="true"]'));
							els = els.append(el.getElements('textarea[name]'));
							els = els.append(el.getElements('select[name]'));
						
						if (els.length > 0) {
							var n = '', t = '', v = '';
							var so;
							
							for (var i = 0; i < els.length; i++) {
								if (typeOf(els[i]) == "element") {
									n = els[i].get('name');
									t = els[i].get('tag');
									
									if (n.length > 0) {
										switch (t) {
										case 'textarea':
											ql[n] = els[i].get('value');
											break;
										case 'select':
											so = els[i].getElements('option[selected][value]');
											if (so.length > 0) {
												for (var j = 0; j < so.length; j++) {
													if (typeOf(so[j]) == "element") {
														v = so[j].get('value');
														v = v.replace('/|/gi','&#124;');
														if (v.length > 0) { ql[n] = (!ql[n] ? v : ql[n]+'|'+v); }
													}
												}
											}
											break;
										case 'input':
											switch (els[i].get('type')) {
											case 'checkbox':
												v = els[i].get('value');
												v = v.replace('/|/gi','&#124;');
												if (v.length > 0) { ql[n] = (!ql[n] ? v : ql[n]+'|'+v); }
												break;
											default:
												ql[n] = els[i].get('value');
											}
											break;
											
										}
										
										ql[n] = ql[n].replace(/</gi,'&#60;');
										ql[n] = ql[n].replace(/>/gi,'&#62;');
									}
								}
							}
						}
					}
				}
				
				return (opt == 'list' ? ql : Object.toQueryString(ql));
			}
	});
	
	Forms = this.Forms = new Forms();
	
})();
