﻿Array.prototype.echo = function(){var i=0, t='[';for(;i<this.length;i++)t+=this[i]+'\n';alert(t+']');}
var $ = function(i,c){return (i&&i.tagName)?i:(c||document).getElementById(i);}
String.prototype.capitalize = function(){return this.toLowerCase().UCFirst()}
String.prototype.UCFirst = function(){return this.charAt(0).toUpperCase()+this.substring(1)}
String.prototype.prettyUrl = function(){return this.prettyfy()+'/';}
String.prototype.prettyfy = function(){
	var s=this.toLowerCase().trim(),sp=['À','Á','Â','Ã','Ä','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ','Ò','Ó','Ô','Õ','Ö','Ù','Ú','Û','Ü','ß', 'à','á','â','ã','ä','ç','è','é','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ù','ú','û','ü'],n = ['A','A','A','A','A','C','E','E','E','E','I','I','I','I','N','O','O','O','O','O','U','U','U','U','SS','a','a','a','a','a','c','e','e','e','e','i','i','i','i','n','o','o','o','o','o','u','u','u','u'];
	for (var i = 0; i < sp.length; i++)s = s.replace(new RegExp(sp[i],'g'),n[i]);
	s = s.replace(/[^A-Za-z0-9-_\s]/g, '').replace(/[\s]+/g, '-').replace(/IIIAIII/g, '').replace(/[-]+/g, '-');
	if(s[0]=='-') s=s.substring(1);
	if(s.substring(s.length-1)=='-') s=s.substring(0,s.length-1);
	return s;
}
String.prototype.trim = function(){return this.replace(/^\s*|\s*$/g,"").replace(/\s[\s]+/g, ' ');}
String.prototype.shorten = function(i){var l = this.length;return (l > i+3)?this.substring(0, i/2)+'...'+this.substring(l-i/2, l):this;}
Array.prototype.contains = function(c){var i=0; for (;i<this.length;i++)if (this[i]==c)return true;return false;}
Array.prototype.each = function(fn){var i=0,r=[]; for (;i<this.length;i++)if (this[i])r.push(fn(this[i], arguments));return r;}
Array.prototype.removeElementAt = function(i){return this.splice[i,1];}
Array.prototype.removeElement = function(el){var i=0;for(;i<this.length;i++)if(el==this[i])return this.removeElementAt(i);return false;}
Array.prototype.empty = function(){for(var i=0;i<=this.length;i++)this.shift()}
var El = {
	addClassName: function(el, name){if(!El.hasClassName(el,name))el.className += ' '+name;},
	empty: function(el){
		var e;
		while (e = el.firstChild) El.remove(e);
		return;
	},
	remove: function(el){
		if (!el) return;
		Event.clear(el);
		El.empty(el);
		el.parentNode.removeChild(el);
	},
	createNode: function(n,t,c,a){
		var el = document.createElement(n);
		if(t)el.appendChild(document.createTextNode(t));
		if(c)el.className = c;
		if(a)a.appendChild(el);
		return el;
	},
	findNearest: function(el,n){
		while (el.tagName.toLowerCase() != n) el = el.parentNode;
		return el;
	},
	getClassAttribute: function(el,c){
		var s = el.className, i = s.indexOf(c+'[');
		if (!El.hasClassName(el,c)||i < 0) return '';
		return s.substring(i+c.length+1, s.indexOf(']', i));
	},
	getClasses: function(e){return e.className.split(' ');},
	getElementsByClassName: function(name, tag, parent){
		var c = ($(parent)||document.body).getElementsByTagName(tag||'*'), i, els = [];
		for (i = 0; i < c.length; i++)
			if (El.hasClassName(c[i], name))
				els.push(c[i]);
		return els;
	},
	getElementsByTagName: function(n,e){
		var r=[],i,nl=(e||document).getElementsByTagName(n);
		for (i=0;i<nl.length;i++)r[i]=nl.item(i);
		return r;
	},
	hasClassName: function(el,n){return el.className.match(new RegExp('\\b'+n+'(\[[A-Za-z0-9]+\])?\\b'));},
	nextTag: function(el){do{el=el.nextSibling}while(el&&el.nodeType!=1);return el},
	previousTag: function(el){do{el=el.previousSibling}while(el&&el.nodeType!=1);return el},
	removeClassName: function(el, name){El.replaceClassName(el, name, '');},
	replaceClassName: function(el, oldName, newName){
		if (el.each) el.each(function(e,a){El.replaceClassName(e,a[1],a[2])},oldName, newName);
		else{
			if (oldName==''||!El.hasClassName(el,oldName)) El.addClassName(el,newName);
			el.className = el.className.replace(new RegExp('\\b'+oldName+'\\b'), newName);
		}
	},
	toggleClassName: function(el, name1, name2){
		if (el.each&&el.length){
			for (var i = 0; i < el.length; i++) El.toggleClassName(el[i], name1, name2);
		}
		else{
			if(!el.className) return;
			el = typeof el == 'string'? $(el):el;
			var hcn = El.hasClassName(el,name1);
			El.replaceClassName(el,hcn?name1:name2,hcn?name2:name1);
		}
	}
}
var Event = {
	guid: 1,
	add: function(el, type, fn){
		if (el.addEventListener) el.addEventListener(type, fn, false);
		else{
			if (!fn.$$guid) fn.$$guid=Event.guid++;
			if (!el.events) el.events={};
			var h=el.events[type];
			if (!h){
				h=el.events[type]={};
				if (el['on'+type]) h[0]=el['on'+type];
			}
			h[fn.$$guid]=fn;
			el["on"+type]=Event.exec;
		}
	},
	clear: function(el){
		var t, f, h=el.events;
		for (t in h){ for (f in t) delete el.events[t][f];}
	},
	exec: function(e){
		e=e||window.event;
		var r=true, i, h=this.events[e.type];
		for (i in h){
			this.$$exec=h[i];
			if (!this.$$exec(e))r=false;
		}
		return false;
//		return r;
	},
	remove: function(el, type, fn){
		if (el.removeEventListener) el.removeEventListener(type, fn, false);
		else if (el.events && el.events[type] && fn.$$guid) delete el.events[type][fn.$$guid];
	}
}
var Publer = {
	Date: {
		toNiceDate: function(d){ // hh:mm dd-mm-yyyy
		try{
			var n = new Date(), ymd = d.split(' '),	hm = ymd[0].split(':'), ymd = ymd[1].split('-'), o = new Date(ymd[2], ymd[1]-1, ymd[0], hm[0], hm[1], 0, 0), m =  n.getTime()-(((n.getHours()*60)+n.getMinutes())*60000); //m: midnight in milliseconds
		if (m < o.getTime()) return 'Today at '+hm[0]+":"+hm[1];
		else if (m-86400000 < o.getTime()) return 'Yesterday at '+hm[0]+":"+hm[1];// 86400000 length of a day in miliseconds
		else return ymd[0]+'-'+ymd[1]+'-'+ymd[2]+', '+hm[0]+':'+hm[1];
		}catch (e){}
		return'';}
	},
	FileBrowser: function(field, url, type, win){
		w = window.open('/publer/filebrowser/', '_blank', 'resizable=yes, scrollbars=no, status=yes, menubar=no, location=no, directories=no, toolbar=no, width=795, height=500');
		if (type=='image') w.filter = 'img';
		w.field = win.document.getElementById(field);
	},
	register: function(){
		el = El.getElementsByClassName('nicedate', 'span').each(function(el){el.innerHTML = Publer.Date.toNiceDate(el.innerHTML)});
		el = El.getElementsByClassName('nicename', 'span').each(function(s){s.innerHTML = s.innerHTML.shorten(12)});
		if (!window.XMLHttpRequest){
			Event.add(window, 'scroll', Publer.fixElements, false);
		}
	},
	fixElements: function(){
		if (!window.XMLHttpRequest){
			var t = $('tips'), p = $('version'), m = document.compatMode == "CSS1Compat"? document.documentElement:document.body;
			if (t) t.style.top = m.scrollTop+"px";
			if (p) p.style.top = (m.scrollTop+m.clientHeight-15)+"px";
		}
	}
}
var Help = {
	on: false,
	lock: false,
	currItem: $('help_std'),
	timeout: null,
	toggle: function(){
		Help.on = !Help.on;
		var sh = $('showhelp').getElementsByTagName('a')[0], x = Help.on? (new Date((new Date()).getTime()+(60*60*24*30))).toGMTString():'0';;
		if (Help.on){
			if (document.cookie.indexOf('help1') == -1) document.cookie = 'help=help1;expires='+x+';path=/publer/';
			$('tips').className = 'expand-help';
			sh.innerHTML = sh.innerHTML.replace('Show', 'Hide');	
			sh.className = 'up';
			$('page').style.paddingTop = '11em';
		}else{
			document.cookie = 'help=help0;expires='+x+';path=/publer/';
			$('tips').className = 'collapse-help';
			sh.innerHTML = sh.innerHTML.replace('Hide', 'Show');
			sh.className = '';
			$('page').style.paddingTop = '3.5em';
		}
		if (!document.all&&this.blur) this.blur();
		return false;
	},
	show: function(e){
		try{
			if (!Help.on||Help.lock) return;
		}catch(e){return}
		if (Help.timeout) clearTimeout(Help.timeout);
		var cn, i = 0;
		cn = El.getClasses(this);
		while (cn[i].substring(0, 4) != 'help' && i < cn.length)i++;
		Help.replaceMsg(cn[i].substring(5, cn[i].length-1));
	},
	showStd: function(){
		try{
			if (!Help.on||Help.lock) return;
		}catch(e){return}
		Help.timeout = setTimeout("Help.replaceMsg('std')", 500);
	},
	addHighlight: function(el){
		Event.add(el, 'mouseover', function(){El.addClassName(this, 'hover')}, false);
		Event.add(el, 'mouseout', function(){El.removeClassName(this, 'hover')}, false);
	},
	register: function(){

		// Add Highlights to buttons
		El.getElementsByClassName('button', 'ul').each(function(button){
			El.getElementsByTagName('li',button).each(function(el){
				Help.addHighlight(el);
			});
		});
		El.getElementsByClassName('nextbutton', 'input').each(function(nxt){Help.addHighlight(nxt);});
		El.getElementsByClassName('previousbutton', 'input').each(function(prev){Help.addHighlight(prev);});
		El.getElementsByClassName('submit-button', 'button').each(function(submit){Help.addHighlight(submit);});
		El.getElementsByClassName('draft-button', 'button').each(function(draft){Help.addHighlight(draft);});
		El.getElementsByClassName('cancel-action', 'a').each(function(cancel){Help.addHighlight(cancel);});			
		
		/* custom modal */
		if (typeof jQuery != 'undefined') { 
			jQuery('#nav-logout').click(function(){
				var c = '<p>'+(interLang=='nl'?'Weet u zeker dat u Publer wilt afsluiten?':'Are you sure you want to exit Publer')+'</p><br /><br /><br /><ul class="buttons modal-logout"><li><a href="/publer/logout/" class="modal-logout" title="Logout">'+(interLang=='nl'?'Ja':'Yes')+'</a></li><li><a href="#" title="" class="modal-logout" onclick="jQuery(\'a.modalCloseImg\').click();">'+(interLang=='nl'?'Nee':'No')+'</a></li></ul><br class="break" />';
				Help.createModal({
					content: c,
					height: 200,
					width:400
				});
				return false;
			});
			jQuery('#nav-filebrowser').click(function(){
				if (typeof document.body.style.maxHeight == "undefined"){ /* ie6 */
					Help.createModal({
						height:200,
						width: 400,
						content: interLang=="nl"?"U maakt gebruik van Internet Explorer 6, deze browser is sterk verouderd waardoor de filebrowser niet werkt. Gebruik aub een andere browser om de filebrowser te openen":"Your browser 'Internet Explorer 6' is outdated. Please use another browser to open the filebrowser."
					});
				}else{
					var s = Help.getWindowSize(), h = s.height - 80, w = s.width - 100;
					Help.createModal({
						height: h,
						width: w,
						content:'<iframe scrolling="no" border="0" style="border:none; overflow:visible;" frameBorder="0" src="/publer/filebrowser/?menu=true" width="'+(w-16)+'px" height="'+(h-81)+'px" />'
					});				
				}
				return false;
			});

			jQuery('#nav-feedback').click(function(){
				Help.createModal({
					content:'<form id="shoutForm" action="#" method="post"><p>'+(interLang == 'nl'?'Suggesties, vragen of ergernis? Laat het ons weten!':'Suggestions, questions or irritations? Please let us know')+'</p><textarea name="sMessage" rows="6" cols="40" class="required"></textarea><br /><br /><button type="submit" class="clean-button"><span>Verstuur</span></button></form>',
					width:450,
					height:270
				});
				/* add event handler to created form */
				jQuery('form#shoutForm').submit(function(ev){
					ev.preventDefault();
					var res = screen.width+'x'+screen.height, mesg = jQuery(this).find('textarea[name=sMessage]').val();
					jQuery.post('/publer/scripts/shoutbox.php', {'sResolution':res,'sMessage':mesg}, function(){
						jQuery('form#shoutForm').html('<p style="margin-top:25px; text-align:center;">'+(interLang=='nl'?'We hebben de volgende feedback van u ontvangen:<br />&#39;<em>'+mesg+'</em>&#39;<br /><br />Bedankt voor uw feedback.':'We received the following feedback:<br /><em style="font-size:1.1em;">&#39;'+mesg+'&#39;</em><br /><br />Thank you for your feedback.')+'</p>');
					});
				});				
				return false;
			});

			jQuery('#site-modal').click(function(){
				var s = Help.getWindowSize(), w = s.width - 50, h = s.height - 50;
				Help.createModal({
					height: h,
					width: w,
					content: '<span class="url-preview">'+(interLang=='nl'?'URL naar pagina&#160;&#160;':'URL to page:&#160;&#160;')+'<input type="text" class="txt" value="'+this.href+'" /></span><iframe src="'+this.href+'" width="'+(w-16)+'px" height="'+(h-81)+'px" />'
				});
				return false;
			});

			jQuery('#showShoutBox').click(function(){
				jQuery('#shoutbox').toggleClass('show');
				return false;
			});
		}
	},
	createModal: function(options){
		var h = options.height ? options.height : 400,
		w = options.width ? options.width : 700,
		c = options.content ? options.content : '',
		contId = options.contId ? options.contId : 'simplemodal-container',
		l = options.loading ? options.loading : false;
		
		if(jQuery('div#modal').get(0)){
			jQuery('div#modal').appendTo('body');
		}else{
			jQuery('body').append('<div id="modal" />');
		}
		if(l === true){
			c = '<div class="loading" style="height:inherit">'+c+'</div>';
		}
		jQuery('div#modal').height(h-81).width(w-16).html(c).modal({
			containerCss: {
				height: h,
				width: w,
				containerId: contId
			},
			opacity:40
		});
		if(jQuery('div#modal').find('span.url-preview input.txt').get(0)){
			jQuery('div#modal').find('span.url-preview input.txt').select();
		}
		if(l === true){
			setTimeout(function(){
				jQuery('a.modalCloseImg').click();
			}, 1000);

		}
		if (typeof document.body.style.maxHeight == "undefined"){
			jQuery('a.modalCloseImg').hover(function(){jQuery(this).addClass('modalCloseImg-hover');},function(){jQuery(this).removeClass('modalCloseImg-hover');});
		}
	},
	getWindowSize: function(){ // Get viewport resolution	
		if(typeof window.innerWidth != 'undefined'){ // FF, Safari etc
			return {height: window.innerHeight, width: window.innerWidth};
		}else{ // IE
			return {height: document.documentElement.clientHeight, width: document.documentElement.clientWidth};
		}
	},	
	replaceMsg: function(i){
		var el = $('help_'+i);
		if (!el) return;
		Help.currItem.style.display = 'none';
		Help.currItem = el;
		Help.currItem.style.display = 'block';
	}
};
var Remote = {
	_tid: 1,
	_threads: {},
	getThread: function(){
		var r = new Remote.Thread(this._tid);
		Remote._threads[this._tid++] = r;
		return r;
	},
	getRequest: function(u, t){
		t = t&&t.id?t:Remote.getThread();
		return t.add(new Remote.Request(this._tid++, u, t));
	}
}
Remote.Thread = function(i){this.id = i;}
Remote.Thread.prototype = {
	requests: {},
	_curReq: null,
	add: function(r){this.requests[r.id] = r; return r;},
	clearCurReq: function(){
		var r = this.requests[this._curReq]
		if (r) r.free();
		this._curReq = null;
	},
	close: function(){var i, r = this.requests;for (i in r) r[i].free(); delete this;},
	next: function(){
		if (this._curReq) return;
		var i, r = this.requests;
		for (i in r){
			this._curReq = i;
			r = r[i];
			try{r.mGet?r.get():r.post();}catch (e){}
			break;
		}
	}
}
Remote.Request = function(i, u, t){
	this.id = (i)?i:0;
	this.xhr = null;
	this.thread = t;
	this.url = u;
	var msXML = ['MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
	try {this.xhr = new XMLHttpRequest();}
	catch (e){for (i=0;i<msXML.length;i++) try {this.xhr = new ActiveXObject(msXML[i]);break;}catch (e){}}
	if (!this.xhr) alert('there is no connection to the server.');
	else this.setHandler();
}
Remote.Request.prototype = {
	responders: {},
	data: null,
	mGet: true,
	get: function(){
		this.xhr.open('get', this.url, true);
		this.xhr.send(null);
	},
	free: function(){
		for (var i in this.responders) delete this.responders[i];
		delete this.thread.requests[this.id];
		delete this.xhr;
		//delete this;
	},
	post: function(d){
		this.xhr.open('post', this.url, true);
		this.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.xhr.send(d);
	},
	getServerValues: function(){return this.thread.next();},
	postClientValues: function(data){
		this.mGet = false;
		this.data = data;
		return r.thread.next();
	},
	setHandler: function(){
		var x = this;
		x.xhr.onreadystatechange = function(){
			if (x.id == x.thread._curReq){
				if (x.xhr.readyState == 4){
					try{
						var t = x.xhr.responseText, s = x.xhr.status, r;
						r = x.responders[s](t);
					}catch (e){
						if (s != 200){
//							alert('FAILURE: status '+s+'\n'+t);
//							alert(e.message);
						}
					}finally{
						x.thread.clearCurReq();
						x.thread.next();
					}
					return r;
				}
			}else x.free();
      return'';
		};
	}
}
Event.add(window, 'load', Help.register);
Event.add(window, 'load', Publer.register);
//Resolve the IE background flicker bug
if(document.all)try{document.execCommand('BackgroundImageCache', false, true);}catch(err){}
