// Version 4

if (Object.isUndefined(PAI)) { var PAI = { }; }

PAI = Object.extend(PAI, {
	$: function (element) {
		if (Object.isString(element)) {
			element = document.getElementById(element);
		}
		return Element.extend(element);
	},
	// From prototypejs
	hasClassNameInsensitive: function(element, className) {
		if (!(element = $(element))) { return; }
		className = className.toLowerCase();
	    var elementClassName = element.className.toLowerCase();
	    return (elementClassName.length > 0 && (elementClassName == className ||
	      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
	  },
		
	PAGE: '',
	PAGELINK: '',

	rsh_blank: function () {
		return PAI.PATH+PAI.FOLDER_INCLUDES+'blank.html';
	},
	
	
	listener: function(page, h) {
		page = location.hash.substr(1);
		//Event.fire(window, 'pai:page:listener', [page, h]);
		PAI.Action.Run('page:listener', this, [page, h]);
		
		if (PAI.PAGELINK == page || PAI.PAGELINK === null) { return; }

		PAI.update(page);
	},
	
	skip: function(element) {
		element = PAI.$(element);
		element.addClassName('pai_skip');
		return element;
	},

	checkSkip: function(element) { 
		return element.hasClassNameInsensitive('pai_skip');
	},
	check_links: function(element) {
		element = (element ? PAI.$(element) : document);
		
		var link = element.getElementsByTagName('a');
		for(var i=0; i < link.length; i++) {
			if (!PAI.checkSkip(Element) && PAI.BASEURL == unescape(link[i].href).substr(0, PAI.BASEURL.length)) {
				Event.observe(link[i], PAI.ClickEventName, PAI.click);
				Event.observe(link[i], 'click', function(event) { if (!PAI.checkSkip(this)) { event.preventDefault(); } });
			}
		}
		
		

		var form = element.getElementsByTagName('form');
		for(var i=0; i < form.length; i++) {
			var action = unescape(Element.readAttribute(form[i], 'action'));
			var page = '';
			if (!action) {
				page = PAI.PAGELINK;
			} 
			else if (action.substr(0, PAI.BASEURL.length) == PAI.BASEURL) {
				page = action.substr(PAI.BASEURL.length);
			}
			else if (action.substr(0, PAI.PATH.length) == PAI.PATH) {
				page = action.substr(PAI.PATH.length);
			}

			if (page) {
				PAI.form_pages[form[i].identify()] = page;
				
				//form[i].writeAttribute({'action': 'javascript:alert("form action");'});
				Event.observe(form[i], 'submit', function(event) {
					if (!PAI.checkSkip(this)) {
						event.preventDefault();
						PAI.form(this);
					}
				});
			}
		}
		
		return element;
	},
	
	check_objects: function(e, o) {
		e = (e ? PAI.$(e) : document);
		
		(function(){
			var element = e;
			var count = 0;
			var loaded = 0;
			var options = o || { };
		
			var objectLoad = function() {
				loaded += 1;
				(options.process || Prototype.emptyFunction).apply(element, [count, loaded]);
				if (count == loaded) {
					(options.finish || Prototype.emptyFunction).apply(element, [count]);
				}
			};
		
			var checkObject = function(name) {
				var objects = $A(element.getElementsByTagName(name));
		
		
				objects.each(function(element, index) {
					element = $(element);
					if (!PAI.checkSkip(element)) {
						Event.observe(element, 'load', objectLoad);
						count += 1;
					}
				});
			};
			
		
			checkObject('frame');
			checkObject('frameset');
			checkObject('iframe');
			checkObject('img');
			checkObject('link');
			
			if (!count) {
				(options.finish || Prototype.emptyFunction).apply(element, [count]);
			}
		
		}());
		
		return e;
	},
	
	form_pages: { },
	form: function(element) {
		element = $(element);
		if(PAI.checkSkip(element)) { return; }
		
		if (element.tagName != 'FORM') {
			element = element.up('form');
			if (!Object.isElement(element)) {
				return;
			}
		}
		
		var page = PAI.form_pages[element.identify()];
		if (!page) { return; }
		
		var data = Form.serialize(element, {hash: true});
		
		
		//Event.fire(window, 'pai:form:submit', [page, data]);
		PAI.Action.Run('form:submit', element, [page, data]);
		
		if (element.readAttribute('method') == 'get') {
			var hasParameters = (page.match('\\?') ? true : false);

			if (hasParameters) {
				var get = page.split('?');
				page = get[0];
				get.shift();
				get = get.join('?').toQueryParams();

				data = Object.extend(get, data);
				page += '?'+Object.toQueryString(data);	
			}
			else {
				page += '?'+Object.toQueryString(data);
			}
			
			data = { };
		}
		
		dhtmlHistory.add(page, 'form');
		PAI.update(page, data);
	},

	click: function(event) {
		if(PAI.checkSkip(this)) { return; }
		//if (!Event.isLeftClick(event)) { return; }

		var page = unescape(this.href).substr(PAI.BASEURL.length);
		
		if (PAI.PAGELINK == page) { return; }
		//page = (page ? page : PAI.PageIndex);

		//Event.fire(window, 'pai:page:click', [this, page]);
		PAI.Action.Run('click', this, [page]);
		dhtmlHistory.add(page, 'click');
		PAI.update(page);
	},
	
	go: function(page, post) {
		if (page.substr(0, PAI.BASEURL.length) == PAI.BASEURL) {
			page = page.substr(PAI.BASEURL.length);
		}
		else if (page.substr(0, PAI.PATH.length) == PAI.PATH) {
			page = page.substr(PAI.PATH.length);
		}
		
		if (PAI.PAGELINK == page && !post) { return; }
		//page = (page ? page : PAI.PageIndex);

		//Event.fire(window, 'pai:page:go', [page, post]);
		PAI.Action.Run('go', this, [page, post]);
		dhtmlHistory.add(page, 'go');
		PAI.update(page, post);
	},

	ServerResponses: { },
	update: function(pagelink, post) {
		//Event.fire(window, 'pai:page:beforeload', [pagelink, post]);
		PAI.Action.Run('page:beforeunload', this, [PAI.PAGE, PAI.PAGELINK]);
		
		var hasParameters = (pagelink.match('\\?') ? true : false);
		var hasHash = (pagelink.match('\\#') ? true : false);
		
		if (hasHash) {
			var hash = pagelink.split('#');
			pagelink = hash[0];
			hash = hash[1];
		}
		
		var page = pagelink;
		if (hasParameters) {
			page = pagelink.split('?', 2);
			page = page[0];
		}
		if (page.substr((page.length-1)) == '/') {
			page = page.substr(0, (page.length-1));
		}
		page = (page ? page : PAI.PageIndex);
		
		PAI.PAGE = page;
		PAI.PAGELINK = pagelink;
		
		var RequestInfo = {HASH:hash, PAGE: PAI.PAGE, PAGELINK: PAI.PAGELINK};
		
		var Request = false;

		var url = PAI.BASEURL+pagelink+(hasParameters ? '&' : '?')+'PAI_content=true';

		for (var name in PAI.ContentBoxes) {
			var info = PAI.ContentBoxes[name];
			var box = (info.pages[PAI.PAGE] ? info.pages[PAI.PAGE] : info.Default);
			if (!Object.isElement(PAI.$(info.ID)) ) { continue; }
			//Event.fire(PAI.$(info.ID), 'pai:contentbox:beforeload', [name, info]);
			PAI.Action.Run('contentbox:beforeunload', PAI.$(info.ID), [name, info]);
			if (info.PeriodicalUpdate && info.AjaxUpdater) {
				info.AjaxUpdater.stop();
			}
			if (!info.Static || Object.isUndefined(info.html[box])) {
				url += '&PAI_ContentBoxes[]='+name;
				Request = true;
			}
		}

		if (PAI.PageInfo[page]) {
			document.title = PAI.Title.replace('%s', PAI.PageInfo[page].Title);
			
			if (
				(PAI.StaticPages && PAI.PageInfo[page].Dynamic) || 
				(!PAI.StaticPages && !PAI.PageInfo[page].Static) || 
				!(PAI.ServerResponses[PAI.PAGELINK])
			) { Request = true; }
		}
		else {
			document.title = PAI.Title.replace('%s', 'Undefined title');
			if (!PAI.StaticPages || !PAI.ServerResponses[PAI.PAGELINK]) { Request = true; }
		}
		
		if (post) {
			Request = true;
		}
		
		if (!Request) {
			//Event.fire(window, 'pai:page:noRequest');
			PAI.Action.Run('page:noRequest');
			PAI.updateContent(RequestInfo);
		}
		else {
			new Ajax.Request(url, {
				evalScripts: true, 
				parameters: post, 
				onComplete: function(transport) {
					var ServerResponse = transport.responseJSON;
					var RequestInfo = this;
					
					if (!ServerResponse) {
						alert("PAI Error:\n\n"+transport.responseText.substr(0, 1000));
						return;
					}
					
					PAI.Action.Run('page:beforeload', PAI.$('PAI_content'), [ ServerResponse, RequestInfo ]);
					
					var refresh = transport.getResponseHeader('refresh');
					if (refresh) {
						var r = refresh.split(';');
						var time = r[0].strip()*1000;
						var url = r[1].strip();
						if (url.substr(0, 4) == 'url=') {
							url = url.substr(4);
						}
						else {
							url = this.PAGELINK;
						}
						setTimeout("PAI.go('"+url+"')", time);
					}

					
					
					
					if (Object.isArray(ServerResponse.ContentBoxes)) {
						ServerResponse.ContentBoxes.each(function(info) {
							PAI.ContentBoxes[info.name].html[info.box] = info.html;
							
							if (PAI.ContentBoxes[info.name].PeriodicalUpdate) {
								var AjaxUpdater = PAI.ContentBoxes[info.name].AjaxUpdater;
								if (AjaxUpdater.options.decay) {
									AjaxUpdater.decay = (info.html == AjaxUpdater.lastText ? AjaxUpdater.decay * AjaxUpdater.options.decay : 1);
									AjaxUpdater.lastText = info.html;
								}
								AjaxUpdater.start();
							}
						});
					}
					
					
					delete ServerResponse.ContentBoxes;
					
					ServerResponse.content = (ServerResponse.content ? ServerResponse.content : ' ');
					
					PAI.ServerResponses[RequestInfo.PAGELINK] = ServerResponse;
					
					PAI.updateContent(RequestInfo);
				}.bind(RequestInfo)
			});
		}
		
		
		
	},
	
	updateContent: function(RequestInfo) {
		if (RequestInfo.PAGELINK != PAI.PAGELINK) {
			return;
		}
		
		if (typeof pageTracker == 'object' && PAI.TrackGoogleAnalytics) {
			pageTracker._trackPageview( (RequestInfo.PAGELINK ? PAI.BASEURL+RequestInfo.PAGELINK : PAI.BASEURL) );
		}
		
		var ServerResponse = PAI.ServerResponses[RequestInfo.PAGELINK];
		
		PAI.$('PAI_content').update(ServerResponse.content).PAI_check_links().PAI_check_objects({
			process: function() { 
				//this.fire('pai:page:loadprocess', arguments); 
				PAI.Action.Run('page:loadprocess', this, arguments); 
			},
			finish: function() { 
				//this.fire('pai:page:load', arguments); 
				PAI.Action.Run('page:load', this, arguments); 
			}
		});
		if (PAI.PageInfo[RequestInfo.PAGE]) {
			if (
				(PAI.StaticPages && PAI.PageInfo[RequestInfo.PAGE].Dynamic) || 
				(!PAI.StaticPages && !PAI.PageInfo[RequestInfo.PAGE].Static)
			) { PAI.ServerResponses[RequestInfo.PAGELINK] = null; }
		}
		else if(PAI.StaticPages) {
			PAI.ServerResponses[RequestInfo.PAGELINK] = null;
		}
		
		var ScrollElement = $(RequestInfo.HASH);
		if (Object.isElement(ScrollElement)) {
			Element.scrollTo(ScrollElement);
		}
		
		
		for (var name in PAI.ContentBoxes) {
			var info = PAI.ContentBoxes[name];
			var box = (info.pages[RequestInfo.PAGE] ? info.pages[RequestInfo.PAGE] : info.Default);
			if (Object.isElement(PAI.$(info.ID))) {
				if (info.HideIfEmpty && !info.html[box]) { 
					PAI.$(info.ID).hide(); //.fire('pai:contentbox:hide', [name, info]); 
					PAI.Action.Run('contentbox:hide', PAI.$(info.ID), [name, info]);
				}
				else {
					PAI.$(info.ID).update(info.html[box]).PAI_check_links().PAI_check_objects({
						process: function() { 
							//this.fire('pai:contentbox:loadprocess', arguments); 
							PAI.Action.Run('contentbox:loadprocess', this, arguments);
						},
						finish: function() { 
							//this.fire('pai:contentbox:load', arguments); 
							PAI.Action.Run('contentbox:load', this, arguments);
						}
					}).show();
				}
//				PAI.$(info.ID).fire('pai:contentbox:domloaded', [name, info]);
				PAI.Action.Run('contentbox:domloaded', PAI.$(info.ID), [name, info]);
			}
		}
		
//		Event.fire(window, 'pai:page:domloaded', [ ServerResponse ]);
		PAI.Action.Run('page:domloaded', PAI.$('PAI_content'), [ ServerResponse ]);
	}
});

PAI.Action = {
	actions: { },
	Add: function(action, func) {
		if (!PAI.ACTIONS) { return; }
		if (!this.actions[action]) { 
			this.actions[action] = [ ]; 
		}
		
		this.actions[action][this.actions[action].length] = func;
	},
	Run: function (action, that, args) { 
		if (!PAI.ACTIONS) { return; }
		if (!this.actions[action]) { return false; }
		
		if (action != 'action_run') {
			PAI.Action.Run('action:run', that, [action, args]);
		}
		
		var r = [ ];
		this.actions[action].each(function(func, index) {
			r[index] = func.apply(that, args || [ ]);
		});
		return r;
	}
};


Element.addMethods({
	PAI_check_links: PAI.check_links,
	PAI_check_objects: PAI.check_objects,
	PAI_skip: PAI.skip,
	PAI_submit: function(element) {
		PAI.form(element);
	},
	hasClassNameInsensitive: PAI.hasClassNameInsensitive
});


/* Backwards compatibility */
PAI.Action.Add('page:domloaded', function() {
	PAI.Action.Run('update_complete', this, arguments);
});
PAI.Action.Add('page:load', function() {
	PAI.Action.Run('update_load', this, arguments);
});
PAI.Action.Add('page:listener', function() {
	PAI.Action.Run('listener', this, arguments);
});



Event.observe(window, 'load', function() {
	if (!PAI.RequireJS) {
//		Event.fire(window, 'pai:page:load');
		PAI.Action.Run('page:load', this);
	}
});

Event.observe(document, 'dom:loaded', function() {
	
	PAI.BASEURL = location.protocol+'//'+location.hostname+PAI.PATH+(PAI.LANGUAGE ? PAI.LANGUAGE+'/' : '');
	
	var path = PAI.PATH+(PAI.LANGUAGE ? PAI.LANGUAGE+'/' : '');
	if (location.pathname.length > path.length && location.pathname.substr(0, path.length) == path) {
		if (PAI.RedirectIfNotIndex) {
			location.href = PAI.BASEURL+'#'+location.pathname.substr(path.length)+location.search;
			return;
		}
		else {
			PAI.PAGELINK = PAI.PAGE = location.pathname.substr(path.length);
		}
	}
	else {
		PAI.PAGE = PAI.PageIndex;
	}
	
	window.dhtmlHistory.create({
		toJSON: function(o) {
			return Object.toJSON(o);
		},
		fromJSON: function(s) {
			return s.evalJSON();
		}
	});
	
	dhtmlHistory.initialize();
	dhtmlHistory.addListener(PAI.listener);
	
	

	var page = location.hash.substr(1);

	if (page.substr((page.length-1)) == '/') {
		page = page.substr(0, (page.length-1));
	}
	if (!page) { page = PAI.PAGE; }
	
	if (PAI.RequireJS) {
		PAI.update(page);
	}
	else if (page && PAI.PAGE != page) {
		
		var text = PAI.LoadingText;
		var a = PAI.Action.Run('LoadingText', this, [page]);
		if (Object.isArray(a)) {
			text = a.join("\n");
		}
		PAI.$('PAI_content').update(text);
		
		PAI.update(page);
	}
	else {
		//	Event.fire(window, 'pai:page:domloaded');
		PAI.Action.Run('page:domloaded', this, [ [ ] ]);
	}
	
	var info;
	for (var name in PAI.ContentBoxes) {
		info = PAI.ContentBoxes[name];
//		Event.fire(PAI.$(info.ID), 'pai:contentbox:domloaded', [name, info]);
		PAI.Action.Run('contentbox:domloaded', PAI.$(info.ID), [name, info]);
		if (info.PeriodicalUpdate && Object.isElement(PAI.$(info.ID)) ) {
			info.AjaxUpdater = new Ajax.PeriodicalUpdater(info.ID, PAI.PATH+PAI.FOLDER_INCLUDES+'js/getContentBox.php?box='+name+'&page='+PAI.PAGE, {
				frequency: info.Frequency,
				decay: info.Decay,
				evalScripts: info.EvalScripts
			});
			
			info.AjaxUpdater.ContentBoxName = name;
			
			info.AjaxUpdater._onTimerEvent = info.AjaxUpdater.onTimerEvent;
			info.AjaxUpdater.onTimerEvent = function() {
				this.url = PAI.PATH+PAI.FOLDER_INCLUDES+'js/getContentBox.php?box='+this.ContentBoxName+'&page='+PAI.PAGE;
				this._onTimerEvent();
			};
			
			info.AjaxUpdater._updateComplete = info.AjaxUpdater.updateComplete;
			info.AjaxUpdater.updateComplete = function(response) {
				this._updateComplete(response);
				
				var info = PAI.ContentBoxes[this.ContentBoxName];
				var elmement = PAI.$(info.ID);
				
				if (info.HideIfEmpty && !response.responseText) { 
					elmement.hide();
				}
				else {
					elmement.PAI_check_links().PAI_check_objects().show();
				}
			};
		}
	}
	
	
	PAI.check_links();
	
});