/*
 * DOMcollapse
 * Version 3.0
 * released 06.12.2005
 * Not for commercial reselling or use, unless consent given by the author
 * Check for updates on http://onlinetools.org and http://wait-till-i.com
 *
*/

dc={
	triggerElements:'h2', 	// elements to trigger the effect
	parentElementId:null,	// ID of the parent element (keep null if none)
	uniqueCollapse:false,	// is set to true only one element can be open at a time

	// CSS class names
	trigger:'trigger',
	triggeropen:'expanded',
	hideClass:'hide',
	showClass:'show',

	// pictures and text alternatives
	closedPic:'style/plus.png',
	closedAlt:'ra\u0161iri',
	openPic:'style/minus.png', //TODO this is not the same for desktop
	openAlt:'skupi',
	/* Doesn't work with Safari
		hoverClass:'hover',
	*/
	// request parameters
	uri:'',
	async:'true',
	user:null,
	password:null,
	usermask:33686529,
	filtercontainerid:'cover',
	setRequestParameters:function(uri, async, user, password){
		this.uri = uri;
		this.async = async;
		this.user = user;
		this.password = password;
	},
	setFilterContainerId:function(filtercontainerid){
		this.filtercontainerid = filtercontainerid;
	},
	setMask:function(usermask){
		this.usermask = usermask;
	},
	init:function(e){
		var temp;
		if(!document.getElementById || !document.createTextNode){return;}
		if(!dc.parentElementId){
			temp=document.getElementsByTagName(dc.triggerElements);
		} else if(document.getElementById(dc.parentElementId)){
			temp=document.getElementById(dc.parentElementId).getElementsByTagName(dc.triggerElements);
		}else{
			return;
		}
		dc.tempLink=document.createElement('a');
		dc.tempLink.setAttribute('href','#');
		dc.tempLink.appendChild(document.createElement('img'));
		for(var i=0;i<temp.length;i++){
			if(dc.cssjs('check',temp[i],dc.trigger) || dc.cssjs('check',temp[i],dc.triggeropen)){
				dc.makeTrigger(temp[i],e);
			}
		}
	},
	loadAjaxPages:function(url, containerid){
		var xmlHttpHolder = function() {
			if (window.XMLHttpRequest && !(BrowserDetect.browser == "Explorer" && BrowserDetect.version < 9)) {// code for IE9+, Firefox, Chrome, Opera, Safari
				return new XMLHttpRequest();//Microsoft failed to properly implement the XMLHttpRequest in IE7 and IE8 (can't request local files)
			} else if (window.ActiveXObject) {// code for IE8, IE7, IE6, IE5
				try {
					return new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {}
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
			throw new Error("Can not create XMLHttpRequest");
		};

		// get XMLHttpRequest object
		var xmlHttp = xmlHttpHolder();
		if (xmlHttp == null) return;

		// add root domain as prefix to relative path
		url = dc.uri + url;
		// set onload listener
		xmlHttp.onreadystatechange=function() {
			//TODO how to get url from xmlHttp
			var urlSplited = url.split('/');
			var urlTrail = urlSplited[urlSplited.length - 1]; // for loading images and changing links
			dc.insertPage(xmlHttp, containerid, url.split(urlTrail)[0]);
		};

		try {
			if(dc.async == "false")
				xmlHttp.open('GET', url, false);
			else
				xmlHttp.open('GET', url, true);
		} catch (e) {
			throw new Error ("Can not load page with url " + url);
		}

		if (dc.user != null && dc.password != null) {
			var authHeaderValueHolder = function() {
				// make basic (un, pass) value for authorization header
				value = dc.user + ':' + dc.password;
				hash = Base64.encode(value);
				return "Basic " + hash;
			};
			xmlHttp.setRequestHeader("Authorization", authHeaderValueHolder());
		}

		xmlHttp.send(null);
	},
	insertPage:function(xmlHttp, containerid, baseurl){
		if (xmlHttp.readyState == 4 && (xmlHttp.status==200 || window.location.href.indexOf("http")==-1)) {
			if (document.getElementById(containerid)) {
				document.getElementById(containerid).innerHTML = xmlHttp.responseText;
				dc.filterContent(0);
				dc.loadImages(containerid, baseurl);
				dc.changeLinks(containerid, baseurl);
			}
		}
	},
	filterContent:function(index){
		/*DEMO if (dc.usermask == -1){
			// try to get it from file
		}*/
		var filtered = document.getElementById(dc.filtercontainerid);
		if (filtered) {
			divs = filtered.getElementsByTagName('div');
			var removed = false;
			//var toRemove = new Array();
			for (var i = index; i < divs.length; ++i) {
				var ponder = divs[i].getAttribute('ponder');
				if (ponder) {
					if ((dc.usermask & parseInt(ponder)) == 0) {//remove content for which this user is not subscribed for
						divs[i].parentNode.removeChild(divs[i]);
						removed = true;
						index = i;
						break;
					}
				} else {
					var invponder = divs[i].getAttribute('invponder');
					if (invponder && ((dc.usermask & parseInt(invponder)) != 0)) {
						divs[i].parentNode.removeChild(divs[i]);
						removed = true;
						index = i;
						break;
					}
				}
			}

			if (removed) {
				dc.filterContent(index);
			}
		}
	},
	loadImages:function(containerid, baseurl){
		var imgs = document.getElementById(containerid).getElementsByTagName('img');
		for (var i = 0; i < imgs.length; ++i) {
			var oldsrc = imgs[i].getAttribute('src');
			if (oldsrc.indexOf(dc.uri) != -1) {
				oldsrc = oldsrc.split(dc.uri)[1];
			}
			imgs[i].setAttribute('src', baseurl + oldsrc);
		}
	},
	changeLinks:function(containerid, baseurl){
		var links = document.getElementById(containerid).getElementsByTagName('a');
		for (var i = 0; i < links.length; ++i) {
			var oldhref = links[i].getAttribute('href');
			// is absolute http path
			if (oldhref.indexOf('http:') != -1) {
				continue;
			}

			// is absolute file path
			if (oldhref.indexOf('file:') != -1) {//TODO http protocol
				var urisplit = dc.uri.split('/');
				var oldhrefsplit = oldhref.split('/');
				// get same part
				var iterator = 0;
				var samepart ="";
				while(urisplit[iterator] == oldhrefsplit[iterator]) {
					samepart += oldhrefsplit[iterator] + "/";
					iterator++;
				}

				// and construct relative path
				oldhref = oldhref.split(samepart)[1];
				var deep = urisplit.length - iterator -1; // -1 for last element which is ''
				for (var j = 0; j < deep; ++j) {
					oldhref = '../' + oldhref;
				}

			} else {//relative path
				fn = window["changeLinksForAuthorization"];
				   fnExists = typeof fn === 'function';
				   if(fnExists) {
					   changeLinksForAuthorization(links[i], baseurl, oldhref);
				   }
				   continue;
			}

			links[i].setAttribute('href', baseurl + oldhref);
		}
	},
	makeTrigger:function(o,e){
		var tl=dc.tempLink.cloneNode(true);
		var tohide=o.nextSibling;
		while(tohide.nodeType!=1)
		{
			tohide=tohide.nextSibling;
		}
		o.tohide=tohide;
		if(!dc.cssjs('check',o,dc.triggeropen)){
			dc.cssjs('add',tohide,dc.hideClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.uri + dc.closedPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			o.setAttribute('title',dc.closedAlt);
		}else{
			dc.cssjs('add',tohide,dc.showClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.uri + dc.openPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
			o.setAttribute('title',dc.openAlt);
			dc.currentOpen=o;
		}
		dc.addEvent(o,'click',dc.addCollapse,false);
		/* Doesn't work with Safari
		dc.addEvent(o,'mouseover',dc.hover,false);
		dc.addEvent(o,'mouseout',dc.hover,false);
		*/
		o.insertBefore(tl,o.firstChild);
		dc.addEvent(tl,'click',dc.addCollapse,false);
		// Safari hacks
		tl.onclick=function(){return false;}
		o.onclick=function(){return false;}
	},
	/* Doesn't work with Safari
	hover:function(e){
		var o=dc.getTarget(e);
		var action=dc.cssjs('check',o,dc.hoverClass)?'remove':'add';
		dc.cssjs(action,o,dc.hoverClass)
	},
	*/
	addCollapse:function(e){
		var action,pic;
		// hack to fix safari's redraw bug
		// as mentioned on http://en.wikipedia.org/wiki/Wikipedia:Browser_notes#Mac_OS_X
		if (self.screenTop && self.screenX){
			window.resizeTo(self.outerWidth + 1, self.outerHeight);
			window.resizeTo(self.outerWidth - 1, self.outerHeight);
		}
		if(dc.uniqueCollapse && dc.currentOpen){
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('src',dc.uri + dc.closedPic);
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			dc.currentOpen.setAttribute('title',dc.closedAlt);
			dc.cssjs('swap',dc.currentOpen.tohide,dc.showClass,dc.hideClass);
			dc.cssjs('remove',dc.currentOpen,dc.triggeropen);
			dc.cssjs('add',dc.currentOpen,dc.trigger);
		}
		var o=dc.getTarget(e);
		if(o.tohide){
			if(dc.cssjs('check',o.tohide,dc.hideClass)){
				o.getElementsByTagName('img')[0].setAttribute('src',dc.uri + dc.openPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
				o.setAttribute('title',dc.openAlt);
				dc.cssjs('swap',o.tohide,dc.hideClass,dc.showClass);
				dc.cssjs('add',o,dc.triggeropen);
				dc.cssjs('remove',o,dc.trigger);
			}else{
				o.getElementsByTagName('img')[0].setAttribute('src',dc.uri + dc.closedPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
				o.setAttribute('title',dc.closedAlt);
				dc.cssjs('swap',o.tohide,dc.showClass,dc.hideClass);
				dc.cssjs('remove',o,dc.triggeropen);
				dc.cssjs('add',o,dc.trigger);
			}
			dc.currentOpen=o;
			dc.cancelClick(e);
			//document.getElementById('debug').innerHTML=o.tohide.className;
		}
		else{
			dc.cancelClick(e);
		}
	},
	/* helper methods */
	getTarget:function(e){
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target){return false;}
		while(!target.tohide && target.nodeName.toLowerCase()!='body')
		{
			target=target.parentNode;
		}
		// if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;} Safari fix not needed here
		return target;
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener)
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!dc.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!dc.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp("(^|\\s)" + c1 + "(\\s|$)").test(o.className);
			break;
		}
	}
};
//dc.addEvent(window, 'load', dc.init, false);
//dc.init();