

// -------------------------------------------------------------------------

var paivienNimet = new Array("maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai");

// ------------------------------------------------------------------------

function	jsPreview(sivuid) {
	
	var 	sivuid;
	var		myDiv;
	var		win;
	
	this.sivuid = sivuid;
	
	this.show = function() {
		
		if(this.sivuid) {
			var testdiv = document.createElement("DIV");		
			testdiv.innerHTML="<iframe width=800 height=600 src='index.php?sivu="+this.sivuid+"'></iframe>";
			
			testdiv.style.position = "absolute";
			testdiv.style.left     = "200px";
			testdiv.style.top      = "200px";
			
			this.myDiv = testdiv;		
			document.body.appendChild(testdiv);					
			this.win = new jsStdWindow(testdiv);
		}	
		
	}
	
	this.hide = function() {
		if(this.win) {
			this.win.closeWindow();
		}
	}
	
}

// ------------------------------------------------------------------------


function	createXMLFromString(strXML) {
	
	doc   = createXMLDoc();

	if (window.ActiveXObject)
	{
	  doc.loadXML(strXML);
	} else {
	  var parser=new DOMParser();
	  var doc=parser.parseFromString(strXML,"text/xml");
	}
	return doc;
}

// ------------------------------------------------------------------------
function getVar(name) {
         get_string = document.location.search;         
         return_value = '';
         
         do { //This loop is made to catch all instances of any get variable.
            name_index = get_string.indexOf(name + '=');
            
            if(name_index != -1)
              {
              get_string = get_string.substr(name_index + name.length + 1, get_string.length - name_index);
              
              end_of_value = get_string.indexOf('&');
              if(end_of_value != -1)                
                value = get_string.substr(0, end_of_value);                
              else                
                value = get_string;                
                
              if(return_value == '' || value == '')
                 return_value += value;
              else
                 return_value += ', ' + value;
              }
            } while(name_index != -1)
            
         //Restores all the blank spaces.
         space = return_value.indexOf('+');
         while(space != -1)
              { 
              return_value = return_value.substr(0, space) + ' ' + 
              return_value.substr(space + 1, return_value.length);
							 
              space = return_value.indexOf('+');
              }
          
         return(return_value);        
}
// ------------------------------------------------------------------------

jsNewsPicker = function(intoDivId) {
	
	var 	className;
	var		myDivId;
	var		pPageTree;
	
	this.myDivId = intoDivId;
		
	this.className 		= "dbuutinen";
	this.h2ClassName 	= "uutisnostoh2";
	this.heading 		= "Ajankohtaista";
	this.txtReadmore 	= "Lue lisää";
	this.bulletStr		= ">> ";
	
	this.visibleFieldName = "bVisible";
	
	this.selectNews = function(e) {
		
		var kohde = window.event ? window.event.srcElement : e ? e.target : null;						
		
		if(kohde.newsId) {
			pPageManager.loadContentAreaWithHTML(kohde.newsData);					
		}
	}
	
	this.show = function() {
		var 	html = "";		
		
		var dd = document.getElementById(this.myDivId);
		
		var h2 = document.createElement("h2");
		
		h2.className = this.h2ClassName;
		h2.innerHTML = this.heading;
		
		dd.appendChild(h2);
		
		
		for(i=0; i<this.pPageTree.length;i++) {			
			
												
			if(this.pPageTree[i][this.visibleFieldName]==0) continue;
						
			var p = document.createElement("p");			
			p.innerHTML=this.pPageTree[i].strOtsikko+"<br>";			
			dd.appendChild(p);
			
			// html+="<a href=''>>> lue lisää</a><br>";						
			// html+="<br><br>";						
			
			var a = document.createElement("a");			
			a.href="javascript:;";
			a.innerHTML= this.bulletStr+this.txtReadmore;
			a.newsId   = this.pPageTree[i].id;
			a.newsData = this.pPageTree[i].strTextAsHTML;
			addEvent(a, 'click', jsSafeCallback(this, "selectNews"), false);
			
			// a.onClick = "return false;";

			p.appendChild(a);
			
		}
		
		
		
		// dd.innerHTML = html;
	}
	
	this.loadNews = function() {
						
		var jsds = new jsDataSource();
		this.pPageTree = jsds.getChildren(this.className, 1);		
						
		this.show();
						
	}
	
}
	
// ------------------------------------------------------------------------


jsPublicPageManager = function() {
	
	var 	pPageBrowser;
	var		pPageTree;
	
	var		pageClass;
	var     pageIndexName;
	var		pageClassNameField;
	
	var		usecache;
	var		horizontal;
	
	this.pageClass = "dbsivu";
	this.pageIndexName = "sivu";
	this.pageClassNameField = "strOtsikko";	
	this.contentDivId = "content";	
	this.browserCSSClass = "dyntree";
	this.usecache = 1;
	this.horizontal = 0;
	
	
	this.loadNewPage = function(id) {
		window.location = "?sivu="+id;
	}
	
	this.loadContentAreaWithHTML = function(html) {
		var dd = document.getElementById(this.contentDivId);
		dd.innerHTML = html;
	}
	
	this.loadPageBrowser = function(intoDivId) {
		
		var menu = new jsDynTree(intoDivId);
		
		this.pPageBrowser = menu;
		
		this.pPageBrowser.defaultClass = this.browserCSSClass;
		
		menu.noHideAfterLoad=1;
		
		var jsds = new jsDataSource();
		
		if(this.usecache) {
			jsds.usecache=1;			
		}
		
		this.pPageTree = jsds.getChildren(this.pageClass, 0);
		
		this.pBaseId = this.pPageTree[0].id;
		
		this.pRootPage = this.pPageTree[0];
		this.pPageTree = this.pPageTree[0].children;
		
		menu.useVisibility = 1;
		menu.httpGetAttribute = this.pageIndexName;
		
		menu.horizontal = this.horizontal;
		
		menu.loadFromObjectList(this.pPageTree, this.pageClassNameField);						
				
		
	}
	
	this.formSubmitted = function(postData) {
		
		var ajax   = new jsAJAX("");		
		ajax.url = "?ds=1&ds_cmd=saveForm&ds_className=dblomake&ds_id=0";		           		           		
		ajax.async = false;		
		ajax.post(postData);		
		
		alert("Talletettu");
	}
	
}

// ------------------------------------------------------------------------


jsPublicAJAXPageManager = function() {
	
	var 	pPageBrowser;
	var		pPageTree;
	
	var		pageClass;
	var     pageIndexName;
	var		pageClassNameField;
	
	var		contentDivId;
	var 	currentPageId;
	
	var		eventHandlers;
	
	this.pageClass = "dbsivu";
	this.pageIndexName = "sivu";
	this.pageClassNameField = "strOtsikko";
	
	this.contentDivId = "content";
	this.browserCSSClass = "dyntree";
	
	this.eventHandlers = new Array();
	
	this.currentPageId = getVar(this.pageIndexName);
	
	this.addEventHandler = function(eventName, handler) {
		if(typeof(this.eventHandlers[eventName])=="undefined") {
			this.eventHandlers[eventName] = new Array();
			this.eventHandlers[eventName][this.eventHandlers[eventName].length] = handler;			
		}
	}
	
	this.callEventHandlers = function(eventName) {
		if(typeof(this.eventHandlers[eventName])!="undefined") {
			
			for(var i=0; i<this.eventHandlers[eventName].length; i++) {				
				eval("this.eventHandlers[eventName][i]."+eventName+"()");
			}			
			//this.eventHandlers[eventName] = new Array();
			//this.eventHandlers[eventName][this.eventHandlers[eventName].length] = handler;			
		}		
	}
	
	this.loadNewPage = function(id) {
		// window.location = "?sivu="+id;
		
		var ds = new jsDataSource();					
		var sivuObj = ds.getObject(this.pageClass, id);
		
		// alert(sivuObj);
		
		var dd = document.getElementById(this.contentDivId);
		
		dd.innerHTML = sivuObj.strTextAsHTML;		
		this.currentPageId = id;
				
		this.callEventHandlers("loadNewPage");
				
	}
	
	this.loadContentAreaWithHTML = function(html) {
		var dd = document.getElementById(this.contentDivId);
		dd.innerHTML = html;
	}
	
	this.loadPageBrowser = function(intoDivId) {
		
		var menu = new jsDynTree(intoDivId);
		
		this.pPageBrowser = menu;
		this.pPageBrowser.defaultClass = this.browserCSSClass;
		
		menu.noHideAfterLoad=1;
		
		var jsds = new jsDataSource();
		this.pPageTree = jsds.getChildren(this.pageClass, 0);
		
		this.pBaseId = this.pPageTree[0].id;
		
		this.pRootPage = this.pPageTree[0];
		this.pPageTree = this.pPageTree[0].children;
		
		menu.useVisibility = 1;
		menu.httpGetAttribute = this.pageIndexName;
		menu.loadFromObjectList(this.pPageTree, this.pageClassNameField);						
				
		
	}
	
	this.formSubmitted = function(postData) {
		
		var ajax   = new jsAJAX("");		
		ajax.url = "?ds=1&ds_cmd=saveForm&ds_className=dblomake&ds_id=0";		           		           		
		ajax.async = false;		
		ajax.post(postData);		
		
		alert("Talletettu");
	}
	
}

// ------------------------------------------------------------------------

jsPageManager = function() {

	var	xmlDoc;
	var loader;
	var templates;
	var templateAssoc;
	var templateXMLDoc;
	var currentPageId;

	var		contentDivId;	
		
	var		pageClass;
	var     pageIndexName;	
	var		pageClassNameField;
	
	var		editorObjects;
	
	var		bLoader1;
	var		bLoader2;
	
	var		ready;
	
	this.pageClass = "dbsivu";
	this.pageIndexName = "sivu";
	this.pageClassNameField = "strOtsikko";	
	
	this.templates = new Array();
	this.templateAssoc = new Object();
	
	this.contentDivId = "content";
	
	this.bLoader1 = 0;
	this.bLoader2 = 0;
	this.ready = 0;
	
	
	
	
	this.saveData = function() {
		
		
		var c = document.getElementById(this.contentDivId);
		
		//alert(c.childNodes.length);
		//alert(c.innerHTML);
		
		var myXml="";
		
		for(var i=0; i<c.childNodes.length; i++) {
						
			if(window.ActiveXObject) {	
				myXml += c.childNodes[i].managerObject.myNode.xml;
			} else {					
				var s = new XMLSerializer();		
				myXml += s.serializeToString(c.childNodes[i].managerObject.myNode);							
			}				
		}
		
		
		
		// Ja lopuksi talletetaan data sisään
		// alert(myXml);
		

		
		if(this.currentPageId) {		
			
			var ds = new jsDataSource();			
			myXml = "<content>"+myXml+"</content>";			
			
			// These should not be necessary updates in all cases
			
			//if( this.pageClass=="dbsivu" || 
			//	this.pageClass=="dbuutinen") {
			ds.updateObject(this.pageClass, this.currentPageId, "strText",		 myXml);						
			
			var strHTML = "";
			
			for(var i=0; i<c.childNodes.length; i++) {			
				strHTML += c.childNodes[i].managerObject.findTemplateMark();				
			}
			
			// alert(strHTML);
			// ds.updateObject(this.pageClass, this.currentPageId, "strTextAsHTML", c.innerHTML);						
			ds.updateObject(this.pageClass, this.currentPageId, "strTextAsHTML", strHTML);						
			//}
			
		}
		
	}
	
	this.preview = function() {
		//if(this.prevWin != 0) {
		this.prevWin = new jsPreview(this.currentPageId);		
		this.prevWin.show();
		//}
	}
	
	this.hidepreview = function() {		
		this.prevWin.hide();		
	}
	
	
	this.whenReady = function() {
		
		
		
		var templates2 = this.loader.xmlDoc.documentElement;
		
		this.templateXMLDoc = templates2;
		
		// listataan templatet, joita käytetään
		
		var x = templates2.getElementsByTagName('t');								
		
		
		
		for(var i=0; i<x.length;i++) {		
			
			this.templates[i] = new Object();			
			
			var node = x[i].getElementsByTagName('id');				
			var pId = node[0].childNodes[0].nodeValue;
			var node = x[i].getElementsByTagName('name');	
			var pName = node[0].childNodes[0].nodeValue;			
			var node = x[i].getElementsByTagName('data');	
			var pData = node[0].childNodes[0].nodeValue;			
			
			
			var node = x[i].getElementsByTagName('defaultvalues');	
			if(node.length) {
				var pDef = node[0].childNodes[0].nodeValue;			
				if(window.ActiveXObject) {	
					var str = "";					
					for(var a=0; a<node[0].childNodes.length;a++) {
						str += node[0].childNodes[a].xml;							
					}										
					this.templates[i].def = str;									
				} else {
					
					var s = new XMLSerializer();		
					var str = "";					
					for(var a=0; a<node[0].childNodes.length;a++) {
						str += s.serializeToString(node[0].childNodes[a]);							
					}					
					this.templates[i].def = str;
				}				
			}
			
			
			this.templates[i].id   = pId;
			this.templates[i].name = pName;
			
			this.templateAssoc[pId] = this.templates[i];
								
		}
		
		this.bLoader1 = 1;		
		if(this.bLoader2) this.ready=1;
		
		/*
		// testisisältö sivua varten...				
		m  =  new jsContentManager(templates2,  values,  this.contentDivId,0);
		m2 =  new jsContentManager(templates2,  values2, this.contentDivId,0);
		m3 =  new jsContentManager(templates2,  values3, this.contentDivId,0);
		*/
		
	}
	
	this.undo = function() {
		
		var ajax = new jsAJAX();
		ajax.url = "?ds=1&ds_className="+escape(this.pageClass)
		           +"&ds_id="+this.currentPageId		
		           +"&ds_cmd=undoChange";		          		     
		ajax.async = false;
		ajax.get();
		
		
		this.reloadPage();		
	}
	
	this.redo = function() {
		var ajax = new jsAJAX();
		ajax.url = "?ds=1&ds_className="+escape(this.pageClass)
		           +"&ds_id="+this.currentPageId		
		           +"&ds_cmd=redoChange";		          		     
		ajax.async = false;
		ajax.get();
		this.reloadPage();		
	}
	
	this.reloadPage = function() {
				
		if(this.currentPageId) {
			
			// alert("Loading "+this.pageClass);
			
			if(this.currentPageId) {				
				// dont save data automatically
				// this.saveData();	
			}
								
			// this.currentPageId = pageid;
						
			var pageid = this.currentPageId;
			
			var c = document.getElementById(this.contentDivId);			
			while(c.firstChild) {
				c.removeChild(c.firstChild);
			}
			
			var ds = new jsDataSource();					
			var sivuObj = ds.getObject(this.pageClass, pageid);
			
			var contentXML = createXMLFromString(sivuObj.strText);
					
			var x = contentXML.documentElement.getElementsByTagName("cvalues");
			
			for(var i=0; i<x.length; i++) {
	
				var str = "";
				if(window.ActiveXObject) {	
					str = x[i].xml;
				} else {					
					var s = new XMLSerializer();		
					str = s.serializeToString(x[i]);							
				}							
				var m  =  new jsContentManager(this.templateXMLDoc,  str,  this.contentDivId, 0);										
			}
			
			this.currentPageId = pageid;
		}
		
		
	}
	
	
	this.loadNewPage = function(pageid) {
		
		if(!this.ready) return;
		
		
		
		if(this.currentPageId != pageid) {
			
			debug("loading page , now : "+this.currentPageId+" - "+pageid);
						
			// alert("Loading "+this.pageClass);
			
			// if is registered Global Callback for new page load			
			if(__cbLoadNewPage) {
				__cbLoadNewPage(pageid);
			}
						
			if(this.currentPageId) {												
				// saving data automatically... not good???								
				// this.saveData();	
			}
			
			this.currentPageId = pageid;
			
			var c = document.getElementById(this.contentDivId);			
			while(c.firstChild) {
				c.removeChild(c.firstChild);
			}
			
			var ds = new jsDataSource();					
			var sivuObj = ds.getObject(this.pageClass, pageid);
			
			var contentXML = createXMLFromString(sivuObj.strText);
					
			var x = contentXML.documentElement.getElementsByTagName("cvalues");
			
			for(var i=0; i<x.length; i++) {
	
				var str = "";
				if(window.ActiveXObject) {	
					str = x[i].xml;
				} else {					
					var s = new XMLSerializer();		
					str = s.serializeToString(x[i]);							
				}							
				var m  =  new jsContentManager(this.templateXMLDoc,  str,  this.contentDivId, 0);										
			}
			
			this.currentPageId = pageid;
		}
		
		
	}
	
	
	this.loadTemplates = function(templatesURL) {
			
		this.loader = new jsXMLLoader();	
		this.loader.parseDoc = jsSafeCallback(this, "whenReady");		
		// this.loader.load("view/contenttemplates/templates.xml");	
		this.loader.load(templatesURL);	
	}	
	

	
	this.templateTypesLoaded = function() {
		
		var templates2 = this.loader2.xmlDoc.documentElement;		
		// listataan templatet, joita käytetään		
		var x = templates2.getElementsByTagName('t');		
		this.editorObjects = new Array();
		
		
		// alert(x.length);				
		
		for(var i=0; i<x.length;i++) {		
		
			
			var node = x[i].getElementsByTagName('id');				
			var pId = node[0].childNodes[0].nodeValue;			
			var node = x[i].getElementsByTagName('name');	
			var pName = node[0].childNodes[0].nodeValue;			
			var node = x[i].getElementsByTagName('data');	
			var pData = node[0].childNodes[0].nodeValue;			
			var node = x[i].getElementsByTagName('class');	
			var pClass = node[0].childNodes[0].nodeValue;			
		
							
			eval(pData);
			this.editorObjects[pId] = pClass;								
		}
				
		this.bLoader2 = 1;		
		if(this.bLoader1) this.ready=1;		
		
	}
	
	this.loadTemplateTypes = function(templatesURL) {
			
		
		this.loader2 = new jsXMLLoader();	
		this.loader2.parseDoc = jsSafeCallback(this, "templateTypesLoaded");		
		// this.loader.load("view/contenttemplates/templatedatatypes.xml");	
		this.loader2.load(templatesURL);	
	}		
	
	
	
	
}

// ------------------------------------------------------------------------

function	jsPath(myDivId) {
	
	var  divId
	var  separatorString;
	var  baseLinkName;
	var  baseLinkId;
	
	this.divId = myDivId;
	this.separatorString = " >> ";
	
	this.baseLink = "";
	this.pageGetVar = "sivu";
	
	this.isChildUnder = function(obj, value) {
	
		var yesno = 0;		
		if(obj.id == value) return 1;		
		var list = obj.children;		
		if(list) {
			for(var i=0; i<list.length; i++) {
				if(list[i].id==value) return 1;
				if(this.isChildUnder(list[i],value)) return 1;
			}
		}
		return 0;
	}
	
	// this.addEventHandler	
	this.loadNewPage = function() {
		// alert("Chaged to "+pPageManager.currentPageId);		
		if(typeof(pPageManager)=="undefined") { 
		} else {
			pPath.loadFromObjectList(pPageManager.pPageTree, "strOtsikko");				
		}
	}
	
	
	this.loadFromObjectList = function(list, nameFieldName) {
		
		var id;  
		var	str = "";
		var level = 0;
		var i=0;
		
		if(typeof(pPageManager)=="undefined") {
			id = getVar(this.pageGetVar);
		} else {		
			id = pPageManager.currentPageId;
		}
		
		// alert(list[0].strOtsikko);
		
		if(!this.baseLinkName) {
			// alert(pPageManager.pRootPage[nameFieldName]);
			this.baseLinkName = pPageManager.pRootPage[nameFieldName];
		}
		
		if(this.baseLinkName) {
			str += "<a class='jsPath' href='?sivu="+this.baseLinkId+"'>"+this.baseLinkName+"</a>";
			level ++;
		} 

		while(i<list.length) {		
			
			if(this.isChildUnder(list[i], id)) {
				if(level>0) {
					str += this.separatorString;
				}				
				str += "<a class='jsPath' href='?"+this.pageGetVar+"="+list[i].id+"'>"+list[i][nameFieldName]+"</a>";
				level++;				
				
				if(typeof(list[i].children)=="undefined") break;				
				list = list[i].children;								
				i=0;				
			} else {
				i++;
			}			
		}
		
		
		var dd = document.getElementById(this.divId);
		dd.innerHTML = str;		
	}		
	
	this.initialize = function() {

		if(!(typeof(pPageManager)=="undefined")) {
						
			pPageManager.addEventHandler("loadNewPage", this);
			this.baseLinkId   = pPageManager.pBaseId;						
			this.loadFromObjectList(pPageManager.pPageTree, pPageManager.pageClassNameField);
			
		} else {
			
		}
		
		
	}
	
	addEvent(window, 'load', jsSafeCallback(this, "initialize"), false);
	
		
};




// ------------------------------------------------------------------------



function	jsDynTree(myDivId) {
	
	var 	myDivId;
	var		items;	
	var		clickHandler;
	var		defaultClass;
	var		httpGetAttribute;
	var		httpGetAttributeValue;
	
	var		objNameField;
	
	var		horizontal;
	
	var		loading;
	
	this.httpGetAttribute = "";
	this.httpGetAttributeValue = 0;
	this.items = new Array();
	
	this.myDivId = myDivId;
	this.defaultClass = "dyntree";
	
	this.useVisibility = 0;
	this.visibleFieldName = "bVisible";
	
	
	this.horizontal=0;
	
	this.loading = 0;
	
	
	
	
	
	// this.pageGetVar = "sivu";
	
	// this.nodeLoader = new jsNodeLoader();
	
	this.loadFromXML = function(node) {		
				
		var 	d = document.getElementById(this.myDivId);				
		this.addNodeMenus(d, node,0);						
		__js_DT_mouseDown = 0;
		
	}
	
	this.getChildren = function(className, objectId) {
		
	}
	
	
	this.loadFromObjectList = function(list, nameField) {
				
		
		if(typeof(this.httpGetAttribute)!="undefined") {
			this.httpGetAttributeValue = getVar(this.httpGetAttribute);	

		};
		this.items = new Array();
				
		var 	d = document.getElementById(this.myDivId);				
		this.addNodeMenus2(d, list, 0, nameField,0);						
		__js_DT_mouseDown = 0;
		
		
		/*
		alert(d.innerHTML);
		
		var ta = document.createElement("textarea");		
		document.body.appendChild(ta);
		ta.value = d.innerHTML;
		*/
		
		
		
	}
		
	this.treeMouseUp = function(e) {		
		
		debug("MouseUp");
		__js_DT_mouseDown = 0;
	}
	
	this.contextMenuHandler = function(e) {
		// mcontext.show();
		
		var kohde = window.event ? window.event.srcElement : e ? e.target : null;						
		
		// alert(__contextTarget);
		
		mcontext2.showAt(dc.mouseCoords(e));
	}
	
	
	this.linkClick = function(e) {
		return false;
	}
	
	this.treeMouseDown = function(e) {		
		
		// expand always
		var target = window.event ? window.event.srcElement : e ? e.target : null;						
		
		var t2 = window.event ? window.event.srcElement : e ? e.target : null;			
		
		debug("jsDynTree.treeMouseDown()");
		debug("Target:"+target);
		debug("t2:"+t2);
		
		// alert("Wait");
		//pPageManager.loadNewPage(1);		
		//return;
		
		var rightclick = 0;
		
		
		if (!e) var e = window.event;
		if (e.which) rightclick = (e.which == 3);
		else if (e.button) rightclick = (e.button == 2);
		
		if(rightclick) return;
		
		// debug('Rightclick: ' + rightclick); // true or false		

		if(target.nodeName=="A") {
			target = target.parentNode;
		}
		
		
		/*
		if(typeof(pPageManager)!="undefined") {
			
			if(pPageManager && (typeof(target.pObj)!="undefined")) {						
				pPageManager.loadNewPage(target.pObj.id);						
			} else {								
				// pPageManager.loadNewPage(target.pObj.id);						
			}											
		}
		*/
		
		// loadPage(e);
		
		
		if(!this.loading) {
			this.loading = 1;
			//alert("Loading");

			var millis = 30;			
			var date = new Date();
			var curDate = null;
			
			do { curDate = new Date(); 
			} while(curDate-date < millis);
			
			
			if(t2.managerObject) {		
				__contextTarget = t2.managerObject;							
				__contextMouseCoords = dc.mouseAbsCoords(e);
				if(__contextTarget) {		
					if(pPageManager) 
					{	
						// alert(__contextTarget.pObj.iParentId);												
						//if(__contextTarget.pObj.iParentId > 0) {							
						debug("calling: pPageManager.loadNewPage(" +__contextTarget.pObj.id);						
						setTimeout("pPageManager.loadNewPage("+__contextTarget.pObj.id+")", 300);											
						//}						
					}								
				}
			}
			//alert("Loaded");
			this.loading = 0;
		}
		
		// return;
		
			
		/*
		
		if(pPageManager) 
		{						
			if(pPageManager.loader2) {
				
				if(pPageManager.editorObjects) {
					if(target.pObj) {			
						pPageManager.loadNewPage(target.pObj.id);						
					}
					
				}
			} else {						
				if(target.pObj) {			
					pPageManager.loadNewPage(target.pObj.id);						
				}
			}
		}								
		*/
		
							
		// debug("MouseDown "+this.mouseDown);
		
		if(target.nodeName=="LI") {			
			
			if(target.childNodes.length >0) {
				var wasch = 0;
				for(var i=0; i<target.childNodes.length; i++) {
					var ch = target.childNodes[i];
					if(ch.nodeName=="UL") {
						
						wasch = 1;
						var subnodes = ch.childNodes;
						
						// debug("ch");
						if(__js_DT_mouseDown==0){						
							if(ch.style.display=="block") {
								ch.style.display = "none";
								target.className = "liClosed";
							} else {
								ch.style.display = "block";
								target.className = "liOpen";
							}														
							__js_DT_mouseDown = 1;
						} else {
							debug("no mouse");
						}
						
					}
				}
				
				if(!wasch) {
					target.className = "liBullet";
					// alert("Subnode click");					
					
					if(target.treeView) {
						target.treeView.loadNode(target);
					}
					
				}
			} 
		}
		
		
		return true;
		
	}
	
	this.registerNodeLoader = function(pClass) {
		this.nodeLoader = pClass;		
	}
		
	this.loadNode = function(pNode) {		
		// alert(pNode.pNode);		
		
		if(!pNode) return;
		var node = pNode.pNode;		
		if(!node) return;
		
		var x = node.getElementsByTagName('data');								
		var	v = {};
		var pName;
		var pValue;
		
		var cnt = 0;		
		
		for(var i=0; i<x.length;i++) {					
			if(x[i].parentNode != node) continue;			
			//pValue = x[i].childNodes[0].nodeValue;					
			
			// Eli pValue = value joka ladataan
			// alert(pValue);								
			
			if(this.nodeLoader) {								
				this.nodeLoader.load(x[i]);							
			}						
		}		
				
	}
	
	this.addNodeMenus = function(root, node, rlevel) {
		
		var x = node.getElementsByTagName('node');								
		var	v = {};
		var pName;
		var pValue;
		
		var cnt = 0;
		
		var 	root2 = document.createElement("UL");		
		root2.className = this.defaultClass;		
		
		if(rlevel>0) {
			root2.style.display    = "none";
		}
				
		for(var i=0; i<x.length;i++) {		
			
			if(x[i].parentNode != node) continue;
			cnt++;
									
			var nimi = x[i].getElementsByTagName('name');				
			pName = nimi[0].childNodes[0].nodeValue;
			
			//var value = x[i].getElementsByTagName('link');	
			//pValue = value[0].childNodes[0].nodeValue;			
			
			var	liNode 	   = document.createElement("LI");
			var	aNode  	   = document.createElement("A");
			
			if(root.id) {				
				liNode.id = root.id+"node"+i+"_";				
				aNode.id = liNode.id+"item"+i+"_";
			} else {				
				liNode.id = "node"+i+"_";
				aNode.id = liNode.id+"item"+i+"_";
			}
			
			// alert(liNode.id);
			
			liNode.pNode    = x[i];
			liNode.treeView = this;
			
			// liNode.innerHTML = pName;
						
			aNode.href = "javascript:return false;";
			
			aNode.innerHTML = pName;						
			liNode.appendChild(aNode);
			
			
			aNode.contextMenuHandler = this.contextMenuHandler;
			
			
			liNode.className = "liBullet";
			
			
			
			//addEvent(liNode, 'click', jsSafeCallback(this, "treeMouseDown"),false);
			addEvent(liNode, 'mousedown', jsSafeCallback(this, "treeMouseDown"),false);
			// addEvent(liNode, 'mouseup', this.treeMouseUp, false);
			
			//addEvent(aNode, 'click', this.linkClick, false);
			//addEvent(aNode, 'mousedown', this.treeMouseDown, false);
			//addEvent(aNode, 'mouseup', this.treeMouseUp, false);
			
			
			//addEvent(liNode, 'mouseout', this.getMoutFor(liNode), false);
						
			root2.appendChild(liNode);
			
			this.addNodeMenus(liNode, x[i], rlevel+1);
								
		}		
		
		if(cnt)	{
			root.className = "liClosed";
			
			root.appendChild(root2);
		}
		
	}
	
	this.isChildUnder = function(obj, value) {
	
		var yesno = 0;
		
		if(obj.id == value) return 1;
		
		var list = obj.children;
		
		if(list) {
			for(var i=0; i<list.length; i++) {
				if(list[i].id==value) return 1;
				if(this.isChildUnder(list[i],value)) return 1;
			}
		}
		return 0;
	}
	
	this.dblClick = function(e) {
		var target = window.event ? window.event.srcElement : e ? e.target : null;						
		
		if(target.managerObject) {
		
			__contextTarget = target.managerObject;				
			editItem();		
		}	
	}
	
	
	
	// creates an UL -node filled with subnodes
	// x = list of objects to add, 
	// root = UL -element under which to add the object
	// nameField is the field in the object which can be used as "name"
	// "open" indicates whether or not the UL item would be considered as "open"
		
	this.addNodeMenus2 = function(root, x, rlevel, nameField, open) {
								
		var	v = {};
		var pName;
		var pValue;
		
		var cnt = 0;
		
		this.objNameField = nameField;
		
		var 	root2 = document.createElement("UL");		
		root2.className = this.defaultClass;		
		
		if(rlevel>0) {			
			if(!open) {
				root2.style.display    = "none";
			} else {
				root2.style.display    = "block";
			}
		}
		
		for(var i=0; i<x.length;i++) {		
			
			var newItem = new Object();
			
			cnt++;
					
			var nimi;			
			var visible;
			
			eval("nimi = x["+i+"]."+nameField);							
			eval("visible = x["+i+"]."+this.visibleFieldName);							
			
			if(this.useVisibility==1) {				
				if(visible==0) continue;
			}
						
			pName = nimi;
								
			var	liNode 	   = document.createElement("LI");
			var	aNode  	   = document.createElement("A");
						
			if(root.id) {				
				liNode.id = root.id+"node"+i+"_";				
				aNode.id = liNode.id+"item"+i+"_";
			} else {				
				liNode.id = "node"+i+"_";
				aNode.id = liNode.id+"item"+i+"_";
			}
			
			liNode.pObj     = x[i];
			liNode.treeView = this;
			
			// aNode.href = "javascript:;";			
			// aNode.href = "#";			
			aNode.href = "javascript:;";			
			
			aNode.innerHTML = pName;						
			liNode.appendChild(aNode);
			
			aNode.contextMenuHandler = this.contextMenuHandler;
			
			aNode.managerObject = new Object();
			
			aNode.managerObject.tree = this;
			aNode.managerObject.pObj = x[i];
			aNode.managerObject.aNode = aNode;
			aNode.managerObject.ulNode = root2;
			
			newItem.pObj 	      	    = x[i];
			newItem.innerHTMLDataObject = aNode;
			newItem.removableNode	    = liNode;
			
			aNode.dataItem  = newItem;
			liNode.dataItem = newItem;
			
			this.items[this.items.length] = newItem;
			

			liNode.className = "liBullet";
			
			if(visible==0) {
				aNode.className = "liHidden";
			}
						
			
			var open=0;
			if(this.httpGetAttributeValue) {
				
				if(this.isChildUnder(x[i], this.httpGetAttributeValue)) {			
					open=1;					
				} 				
				
				if(x[i].id == this.httpGetAttributeValue) {
					aNode.className = "liSelected";
				}
			}			
			
			// addEvent(liNode, 'dblclick', this.dblClick, false);
			
			// addEvent(liNode, 'click', jsSafeCallback(this, "treeMouseDown"),false);
			addEvent(liNode, 'mousedown', jsSafeCallback(this, "treeMouseDown"),false);
			addEvent(liNode, 'mouseup',   jsSafeCallback(this, "treeMouseUp"),false);
			// addEvent(liNode, 'mousedown', this.treeMouseDown, false);
			// addEvent(liNode, 'mouseup', this.treeMouseUp, false);
			
			if(this.horizontal) {				
				// addEvent(liNode, 'mousedown', this.treeMouseDown, false);
			}
									
			root2.appendChild(liNode);
			
			if((this.horizontal) && (rlevel==0)) {
				// alert("Appending new child");
				root.appendChild(root2);	
				root2 = document.createElement("UL");		
				root2.className = this.defaultClass;						
			}
			
			this.addNodeMenus2(liNode, x[i].children, rlevel+1, nameField, open);
								
		}		
		
		
		
		if(cnt)	{
			// root.className = "liClosed";			
			if((this.horizontal) && (rlevel==0)) {
				// jos horizontal -menu ei lisätä
				// alert("Done");
			} else {
				root.appendChild(root2);
			}
		}
		
	}
	
	this.insertNodes = function(root, x) {
								
		var	v = {};
		var pName;
		var pValue;
		var root2;
		
		var nameField = this.objNameField;
		
		var cnt = 0;
		var insertNew = 0;
		
		var subULS = root.getElementsByTagName("UL");
		
		if(subULS.length==0) {
			root2 = document.createElement("UL");					
			insertNew = 1;
		} else {
			root2 =subULS[0];
		}
		
		
		for(var i=0; i<x.length;i++) {		
			
			var newItem = new Object();
			
			var obj = x[i];
			
			for(var a=0; a<this.items.length;a++) {
				
				if(this.items[a].pObj.id == obj.iParentId) {															
					var subNodes = this.items[a].removableNode.childNodes;					
					var wasFound=0;					
					for(var b=0; b<subNodes.length;b++) {
						if(subNodes[b].nodeName=="UL") {
							root2 = subNodes[b];
							wasFound=1;						
						}						
					}
					
					if(!wasFound) {
						root2 = document.createElement("UL");
						this.items[a].removableNode.appendChild(root2);
					}
			
					
					
			//newItem.pObj 	      	    = x[i];
			//newItem.innerHTMLDataObject = aNode;
			//newItem.removableNode	    = liNode;
					
				}// liNode
			}
			
			
			cnt++;
					
			var nimi;			
			var visible;
			
			eval("nimi = x["+i+"]."+nameField);							
			eval("visible = x["+i+"]."+this.visibleFieldName);							
			
			if(this.useVisibility==1) {				
				if(visible==0) continue;
			}
						
			pName = nimi;
								
			var	liNode 	   = document.createElement("LI");
			var	aNode  	   = document.createElement("A");
						
			
			// meneekö sekaisin jos tehdään näin????			
			liNode.id = "node"+i+"_";
			aNode.id = liNode.id+"item"+i+"_";
			
			
							
			
			liNode.pObj     = x[i];
			liNode.treeView = this;
			
			aNode.href = "javascript:;";			
			aNode.innerHTML = pName;						
			liNode.appendChild(aNode);
			
			aNode.contextMenuHandler = this.contextMenuHandler;
			
			aNode.managerObject = new Object();
			
			aNode.managerObject.tree = this;
			aNode.managerObject.pObj = x[i];
			aNode.managerObject.aNode = aNode;
			aNode.managerObject.ulNode = root2;
			
			newItem.pObj 	      	    = x[i];
			newItem.innerHTMLDataObject = aNode;
			newItem.removableNode	    = liNode;
			

			//alert("HERE");
			//return;			
			
			aNode.dataItem  = newItem;
			liNode.dataItem = newItem;
						
			this.items[this.items.length] = newItem;			
			
			
			
			liNode.className = "liBullet";
						
			if(visible==0) {
				aNode.className = "liHidden";
			}
			
			
			
			/*var open=0;
			if(this.httpGetAttributeValue) {
				
				if(this.isChildUnder(x[i], this.httpGetAttributeValue)) {			
					open=1;					
				} 				
				
				if(x[i].id == this.httpGetAttributeValue) {
					aNode.className = "liSelected";
				}
			}			*/
			
			// addEvent(liNode, 'dblclick', this.dblClick, false);
			
			addEvent(liNode, 'mousedown', jsSafeCallback(this, "treeMouseDown"),false);
			// addEvent(liNode, 'mousedown', this.treeMouseDown, false);
			// addEvent(liNode, 'mouseup', this.treeMouseUp, false);
									
			root2.appendChild(liNode);			
						
		}
		
		// root.className = "liOpen";
		// root2.className = "liOpen";
		if(insertNew)	{			
			// __contextTarget.ulNode.appendChild(root2);		
		}
		
		var liList = root.getElementsByTagName("LI");
		liList[0].className = "liOpen";				
		root2.style.display = "block"
		
	}
	
	
	
	
	this.contextMenuDetector = function(e) {
		
		var target = window.event ? window.event.srcElement : e ? e.target : null;						
			
		// debug("SETTING CONTEXT - ON");		
		if(target.contextMenuHandler) {									
			// alert(target.contextMenuHandler);
			target.contextMenuHandler(e);
		}
		
	}
	
	this.contextMenuOut = function(e) {
		__jsDynTree_contextOn = 0;
	}
	
	this.contextHandler = function(e) {
		
		// alert("HERE");
		
		var target = window.event ? window.event.srcElement : e ? e.target : null;			
		
		if(target.managerObject) {		
			__contextTarget = target.managerObject;				
			
			if(!target.managerObject.pObj) {
				
				__contextMouseCoords = dc.mouseAbsCoords(e);				
				mm.showAt(__contextMouseCoords);
			}
		}			
	}
	
	addEvent(document.body, 'contextmenu', jsSafeCallback(this, "contextMenuDetector"), false);
	// addEvent(document.body, 'mouseup', this.contextMenuOut, false);
	

	
	addEvent(document.body, 'contextmenu', jsSafeCallback(this, "contextHandler"), false);
	
}


// ------------------------------------------------------------------------



jsMyMenu = function(menuDivId) {
	
	var 	menuDivId;	// menun sijainti DIV
		
	this.menuDivId = menuDivId;
	
	this.hide = function(e) {
		var 	d = document.getElementById(this.menuDivId);		
		d.style.visibility = "hidden";
	}
	
	this.hideTarget = function(e) {
		var target = window.event ? targetElement : e ? e.currentTarget : null;				
		target.style.visibility = "hidden";
	}
	
	this.show = function() {
		__menuActionCounter = 4;
		var 	d = document.getElementById(this.menuDivId);		
		d.style.visibility = "visible";
	}	
	
	this.showAt = function(pos) {
		
		__menuActionCounter = 5;
		
		var 	d = document.getElementById(this.menuDivId);		
		
		d.style.position = "absolute";
		d.style.left = (pos.x-5)+"px";
		d.style.top = (pos.y-5)+"px";		
		d.style.visibility = "visible";
		
		d.style.zIndex = "1000";
		
		// alert(__contextTarget.pObj);
		
	}	
	
	
	this.mover = function(e, targetElement) {
		
	}
	
	this.itemMouseOver = function(e, targetElement) {
		
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		// TEST
		// var target = window.event ? targetElement : e ? e.currentTarget : null;		
		
		/*
		if(typeof(target.nodeName)=="undefined") {
			alert("No node");
			return;
		}
		*/
		
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		__menuActionCounter = 100;
		
		if(target.nodeName.toLowerCase() == 'li') {			
			// alert(target.nodeName);
			
			if(target== this.actionTarget) {
				this.actionTarget = null;
			}
			for(var i=0; i<target.childNodes.length; i++) {
				var node = target.childNodes[i];				
				if(node.nodeName.toLowerCase() == 'ul') {
					node.style.display = 'block';
					
					// __menuActionCounter = 100;
					
				}
			}
		}		
	}
	
	this.hideActionTarget = function() {
		
		var target = this.actionTarget;
		
		if(target) {
			if(target.nodeName.toLowerCase() == 'li') {			
				// alert(target.nodeName);
				for(var i=0; i<target.childNodes.length; i++) {
					var node = target.childNodes[i];				
					if(node.nodeName.toLowerCase() == 'ul') {
						node.style.display = 'none';					
						__menuActionCounter = 100;
					}
				}
			}
		} 
		
	}
	
	this.itemMouseOut = function(e, targetElement) {
		
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		// var target = window.event ? targetElement : e ? e.currentTarget : null;			
		
		/*
		if(window.event) {
			alert(target.nodeName);
		}
		*/
		
		/*
		if(typeof(target.nodeName)=="undefined") {
			alert("No node");
			return;
		}
		*/
		
		// alert(target.nodeName.toLowerCase());
		
		__menuActionCounter = 100;
					
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		// alert(target.nodeName.toLowerCase());
		
		this.actionTarget = target;
				
		setTimeout(jsSafeCallback(this, "hideActionTarget"), 1000);
		
		
		__menuActionCounter = 1;
		
		
	}
	
	
	this.getMoverFor = function (node) {		
		return function(e) { itemMouseOver(e, node); };
	}
	
	this.getMoutFor = function(node) {
		return function(e) { itemMouseOut(e, node); };
	}	
		
	/*
	this.itemMouseOver = function(e, targetElement) {
		
		var target = window.event ? targetElement : e ? e.currentTarget : null;		
				
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		if(target.nodeName.toLowerCase() == 'li') {			
			// alert(target.nodeName);
			for(var i=0; i<target.childNodes.length; i++) {
				var node = target.childNodes[i];				
				if(node.nodeName.toLowerCase() == 'ul') {
					node.style.display = 'block';
				}
			}
		}
		
	}
	
	this.itemMouseOut = function(e, targetElement) {
		
		var target = window.event ? targetElement : e ? e.currentTarget : null;			
					
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		if(target.nodeName.toLowerCase() == 'li') {			
			// alert(target.nodeName);
			for(var i=0; i<target.childNodes.length; i++) {
				var node = target.childNodes[i];				
				if(node.nodeName.toLowerCase() == 'ul') {
					node.style.display = 'none';
				}
			}
		}
		
	}
	*/
	
	
	this.addNodeMenus = function(root, node) {
		
		var x = node.getElementsByTagName('menu');								
		var	v = {};
		var pName;
		var pValue;
		
		var cnt = 0;
		
		var 	root2 = document.createElement("UL");		
		root2.className = "slidingmenu";
		
		
		for(var i=0; i<x.length;i++) {		
			
			if(x[i].parentNode != node) continue;
			cnt++;
			
			var nimi = x[i].getElementsByTagName('name');				
			pName = nimi[0].childNodes[0].nodeValue;
			var value = x[i].getElementsByTagName('link');	
			pValue = value[0].childNodes[0].nodeValue;			
			
			var	liNode 	   = document.createElement("LI");
			var	aNode  	   = document.createElement("A");
						
			aNode.href = pValue;
			aNode.innerHTML = pName;						
			liNode.appendChild(aNode);
			
			
			addEvent(liNode, 'mouseover',  jsSafeCallback(this, "itemMouseOver"), false);
			// addEvent(liNode, 'mouseover', this.getMoverFor(liNode), false);
			addEvent(liNode, 'mouseout',  jsSafeCallback(this, "itemMouseOut"), false);
			//addEvent(liNode, 'mouseover', this.getMoverFor(liNode), false);
			//addEvent(liNode, 'mouseout',  this.getMoutFor(liNode), false);
						
			root2.appendChild(liNode);
			
			this.addNodeMenus(liNode, x[i]);
								
		}		
		
		if(cnt)	
		root.appendChild(root2);
		
		
		
	}
	
	this.hideMenu = function() {
	
		var divId = this.menuDivId;
		
		d = document.getElementById(this.menuDivId);
		
		if(__menuActionCounter >= 0) {
			__menuActionCounter--;
		}
		
		if(__menuActionCounter <= 0) { 
			d=document.getElementById(divId);
			d.style.visibility = 'hidden'; 
		}
		
		setTimeout(jsSafeCallback(this, "hideMenu"), 1000);
		// setTimeout("__hideMenu('"+divId+"')", 1000);		
		
	}		
	
	
	this.loadFromXML = function(node) {
		
		var 	d = document.getElementById(this.menuDivId);		
		
		// addEvent(d, 'mouseout', this.hideTarget, false);
		
		this.addNodeMenus(d, node);
				
		// d.appendChild(root);
		
		__menuActionCounter = 0;
		
		setTimeout(jsSafeCallback(this, "hideMenu"), 1000);
		// setTimeout("__hideMenu('"+this.menuDivId+"')", 1000);
		
	}	
}
/*


jsMyMenu = function(menuDivId) {
	
	var 	menuDivId;	// menun sijainti DIV

	this.defaultClassName = "slidingmenu"; 		
	this.menuDivId = menuDivId;
	
	this.hide = function(e) {
		var 	d = document.getElementById(this.menuDivId);		
		d.style.visibility = "hidden";
	}
	
	this.hideTarget = function(e) {
		var target = window.event ? targetElement : e ? e.currentTarget : null;				
		target.style.visibility = "hidden";
	}
	
	this.show = function() {
		__menuActionCounter = 4;
		var 	d = document.getElementById(this.menuDivId);		
		d.style.visibility = "visible";
	}	
	
	this.showAt = function(pos) {
		
		__menuActionCounter = 5;
		
		var 	d = document.getElementById(this.menuDivId);		
		
		d.style.position = "absolute";
		d.style.left = (pos.x-5)+"px";
		d.style.top = (pos.y-5)+"px";		
		d.style.visibility = "visible";
		
		d.style.zIndex = "1000";
		
	}	
	
	
	this.mover = function(e, targetElement) {
		
	}
	
	this.getMoverFor = function (node) {		
		return function(e) { itemMouseOver(e, node); };
	}
	
	this.getMoutFor = function(node) {
		return function(e) { itemMouseOut(e, node); };
	}	
		
	this.itemMouseOver = function(e, targetElement) {
		
		var target = window.event ? targetElement : e ? e.currentTarget : null;		
				
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		if(target.nodeName.toLowerCase() == 'li') {			
			// alert(target.nodeName);
			for(var i=0; i<target.childNodes.length; i++) {
				var node = target.childNodes[i];				
				if(node.nodeName.toLowerCase() == 'ul') {
					node.style.display = 'block';
				}
			}
		}
		
	}
	
	this.itemMouseOut = function(e, targetElement) {
		
		var target = window.event ? targetElement : e ? e.currentTarget : null;			
					
		if(target.nodeName.toLowerCase() == 'a') {
			target = target.parentNode;
		}
		
		if(target.nodeName.toLowerCase() == 'li') {			
			// alert(target.nodeName);
			for(var i=0; i<target.childNodes.length; i++) {
				var node = target.childNodes[i];				
				if(node.nodeName.toLowerCase() == 'ul') {
					node.style.display = 'none';
				}
			}
		}
		
	}
	
	
	this.addNodeMenus = function(root, node) {
		
		var x = node.getElementsByTagName('menu');								
		var	v = {};
		var pName;
		var pValue;
		
		var cnt = 0;
		
		var 	root2 = document.createElement("UL");		
		root2.className = this.defaultClassName;
		
		// alert(this.defaultClassName);
		
		for(var i=0; i<x.length;i++) {		
			
			if(x[i].parentNode != node) continue;
			cnt++;
			
			var nimi = x[i].getElementsByTagName('name');				
			pName = nimi[0].childNodes[0].nodeValue;
			var value = x[i].getElementsByTagName('link');	
			pValue = value[0].childNodes[0].nodeValue;			
			
			var	liNode 	   = document.createElement("LI");
			var	aNode  	   = document.createElement("A");
						
			aNode.href = pValue;
			aNode.innerHTML = pName;						
			liNode.appendChild(aNode);
			
			addEvent(liNode, 'mouseover', this.getMoverFor(liNode), false);
			addEvent(liNode, 'mouseout', this.getMoutFor(liNode), false);
						
			root2.appendChild(liNode);
			
			this.addNodeMenus(liNode, x[i]);
								
		}		
		
		if(cnt)	
		root.appendChild(root2);
		
		
		
	}
	
	this.hideMenu = function() {
	
		var divId = this.menuDivId;
		
		d = document.getElementById(this.menuDivId);
		
		if(__menuActionCounter >= 0) {
			__menuActionCounter--;
		}
		
		if(__menuActionCounter <= 0) { 
			d=document.getElementById(divId);
			d.style.visibility = 'hidden'; 
		}
		
		setTimeout(jsSafeCallback(this, "hideMenu"), 1000);
		// setTimeout("__hideMenu('"+divId+"')", 1000);		
		
	}	
	
	
	this.loadFromXML = function(node) {
		
		var 	d = document.getElementById(this.menuDivId);		
		
		// addEvent(d, 'mouseout', this.hideTarget, false);
		
		this.addNodeMenus(d, node);
				
		// d.appendChild(root);
		
		__menuActionCounter = 0;
				
		setTimeout(jsSafeCallback(this, "hideMenu"), 1000);
		
		// alert("No hide");
		
	}
	
}

*/

// -------------------------------------------------------------------------

var IE = document.all?true:false;
if(!IE) {
	Node.prototype.swapNode = function (node) {
  		var nextSibling = this.nextSibling;
  		var parentNode = this.parentNode;
  		node.parentNode.replaceChild(this, node);
  		parentNode.insertBefore(node, nextSibling);  
	}
}

var uuid_cnt=0;
function	uuid() {
	var d = new Date()
	var ID = d.getDate()+""+d.getMonth() + 1+""+d.getFullYear()+""+d.getHours()+""+d.getMinutes()+""+d.getSeconds()+uuid_cnt++;		
	return ID;
}

// ----------------------------------------------------------------------------------

var IE = document.all?true:false;
if(!IE) {
	Node.prototype.swapNode = function (node) {
  		var nextSibling = this.nextSibling;
  		var parentNode = this.parentNode;
  		node.parentNode.replaceChild(this, node);
  		parentNode.insertBefore(node, nextSibling);  
	}
}


// ----------------------------------------------------------------------------------

function	jsAJAX(url) {
	
	// request URL and request "object"
	var url;
	var data;
	var req;
	var async;
	
	this.url   = url;
	this.async = true;
	
	this.get = function() 
	{
		
		var url = this.url;
		
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();
	        this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	        this.req.open("GET", url, this.async);
	        this.req.send(null);
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (this.req) {
	            this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	            this.req.open("GET", url, this.async);
	            this.req.send();
	        }
	    }
	}	
	
	this.getWithCallback = function() 
	{
		var url = this.url;
		
		// alert(escape(url));
	
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();	        
	        this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	        this.req.open("GET", url, true);
	        this.req.send(null);
	        __com_called++;
	        //document.body.style.cursor='wait';
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	
	        if (this.req) {
		        // req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
	            this.req.onreadystatechange = jsSafeCallback(this, "processCallback");
	            this.req.open("GET", url, true);
	            this.req.send();
	            //__com_called++;
	            //document.body.style.cursor='wait';
	        }
	    }    
	}	
	
	this.post = function(vars) 
	{
		var url = this.url;
		var req;
	
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();	        
	        this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	        this.req.open("POST", url, this.async);
			this.req.setRequestHeader('Content-Type',
				'application/x-www-form-urlencoded');            
	        
	        this.req.send(vars);
	        
	        
	    	// branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (this.req) {
		        // req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
	            this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	            this.req.open("POST", url, this.async);
	  			this.req.setRequestHeader('Content-Type',
									    'application/x-www-form-urlencoded');            
	            this.req.send(vars);
	            //__com_called++;
	            //document.body.style.cursor='wait';
	        }
	    }    
	}	
	
	
	this.postWithCallback = function(vars) 
	{
		var url = this.url;
		var req;
	
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();	        
	        this.req.onreadystatechange = jsSafeCallback(this, "processCallback");
	        this.req.open("POST", url, true);
			this.req.setRequestHeader('Content-Type',
				'application/x-www-form-urlencoded');            
	        
	        this.req.send(vars);
	        __com_called++;
	        
	    	// branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (this.req) {
		        // req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
	            this.req.onreadystatechange = jsSafeCallback(this, "processCallback");
	            this.req.open("POST", url, true);
	  			this.req.setRequestHeader('Content-Type',
									    'application/x-www-form-urlencoded');            
	            this.req.send(vars);
	            //__com_called++;
	            //document.body.style.cursor='wait';
	        }
	    }    
	}	
	
	this.getWithSync = function() 
	{
		var url = this.url;
	
		if(this.echo) {
			alert(url);
		}
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();	        
	        this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");
	        this.req.open("GET", url, false);
	        this.req.send(null);
	        // document.body.style.cursor='wait';
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (this.req) {
		        // req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
		        this.req.onreadystatechange = jsSafeCallback(this, "processReqChange");	            
	            this.req.open("GET", url, false);
	            this.req.send();
	        }
	    }    
	}	
	
	
	this.getWithCallbackSync = function() 
	{
		var url = this.url;
	
		if(this.echo) {
			alert(url);
		}
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        this.req = new XMLHttpRequest();	        
	        this.req.onreadystatechange = jsSafeCallback(this, "processCallback");
	        this.req.open("GET", url, false);
	        this.req.send(null);
	        // document.body.style.cursor='wait';
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        this.req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (this.req) {
		        // req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
	            this.req.onreadystatechange = jsSafeCallback(this, "processCallback");
	            this.req.open("GET", url, false);
	            this.req.send();
	        }
	    }    
	}	
	
	this.processCallback = function() 
	{		
	    if (this.req.readyState == 4) {
	        
	        if (this.req.status == 200) {
		        
	            eval(this.req.responseText);
	            	                 
	        } else {
		        
	        }
	
	    }	   
	}	
	
	
	this.processReqChange = function() 
	{
	    // only if req shows "complete"
	    if (this.req.readyState == 4) {
	        // only if "OK"
	        if (this.req.status == 200) {
		        
	            // ...processing statements go here...
	            
	        } else {
		        // Nothing is done here
	        }
	    }
	}
	

}

// ----------------------------------------------------------------------------------

jsStdWindow = function(buildOnDiv) {
	
	var id;
	
	var origHTML="";
	if(buildOnDiv.innerHTML.length > 0) {
		origHTML = buildOnDiv.innerHTML;
	}
	
	if(!buildOnDiv.id) {
		buildOnDiv.id = uuid();		
	}
	
	this.id = buildOnDiv.id;
	
	var cb = jsSafeCallbackName(this, "closeWindow");	
	var menus = "<a href='javascript:"+cb+"' class='stdWindowLink'>Sulje ikkuna</a><br><br>";
	
	buildOnDiv.innerHTML = menus + origHTML;
	buildOnDiv.className ="stdWindow";
	
	
	dc.makeDraggable(buildOnDiv);
	
	this.closeWindow = function() {
		
		var dd = document.getElementById(this.id);
		dd.style.visibility = "hidden";		
		dd.parentNode.removeChild(dd);		
	}
	
}



// ----------------------------------------------------------------------------------

function	jsDataSource() {
	
	var	usecache;
	
	this.usecache = 0;
	
	this.getAllChildren = function(className, objectId) {
		
		// ds_className = className
		// ds_id 		= objectId
		// ds_cmd		= getChildren
		
		var objects;		
		var ajax   = new jsAJAX("");
		
		
				
		var ds_cmd = "getChildren";
		
		ajax.url = "?ds=1&ds_className="+escape(className)
		           +"&ds_id="+objectId		
		           +"&ds_cmd="+ds_cmd;		          
		           
		if(this.usecache) {
			ajax.url += "&usecache=1";
		}		        
		
		alert(ajax.url);   
		     
		ajax.async = false;
		ajax.get();
				                 		    
		// ajax.getWithCallbackSync();
		
		var objects = ajax.req.responseText.parseJSON();
				                  		
		
		for(var i=0; i<objects.length;i++) {
			objects[i].children = this.getChildren(className, objects[i].id);
		}
				
		return objects;
				
	}	
	
	
	this.getChildren = function(className, objectId) {
		
		// ds_className = className
		// ds_id 		= objectId
		// ds_cmd		= getChildren
		
		var objects;		
		var ajax   = new jsAJAX("");
		
		
				
		var ds_cmd = "getAllChildren";
		
		ajax.url = "?ds=1&ds_className="+escape(className)
		           +"&ds_id="+objectId		
		           +"&ds_cmd="+ds_cmd;		          
		           
		if(this.usecache) {
			ajax.url += "&usecache=1";
		}		        
		
		// alert(ajax.url);		           
		     
		ajax.async=false;
		ajax.get();		                 		    	
		// ajax.getWithCallbackSync();
		
		var objects = ajax.req.responseText.parseJSON();
		

				                  		
		/*
		for(var i=0; i<objects.length;i++) {
			objects[i].children = this.getChildren(className, objects[i].id);
		}
		*/
				
		return objects;
				
	}
	
	this.getObject= function(className, objectId) {
		
		// ds_className = className
		// ds_id 		= objectId
		// ds_cmd		= getChildren
		
		var objects;		
		var ajax   = new jsAJAX("");
				
		var ds_cmd = "getObject";
		
		ajax.url = "?ds=1&ds_className="+escape(className)
		           +"&ds_id="+objectId		
		           +"&ds_cmd="+ds_cmd;		          
		           		    
		ajax.async=false;
		ajax.get();		                 		    	
		                  		
		// ajax.getWithCallbackSync();
				
		var object = ajax.req.responseText.parseJSON();				
		return object;
				
	}
	
	
	this.updateObject = function(className, objectId, fieldName, fieldValue) {
		
		// ds_className = className
		// ds_id 		= objectId
		// ds_cmd		= getChildren
		
		var objects;		
		var ajax   = new jsAJAX("");
				
		var ds_cmd = "update";
				
		ajax.url = "?ds=1&ds_className="+escape(className)
				   +"&cmd=update"
				   +"&className="+escape(className)
				   +"&id="+objectId
		           +"&ds_id="+objectId		
		           +"&ds_cmd="+ds_cmd;		          
		           		           
		var postData = "command=update&id="+objectId+"&"+fieldName+"="+escape(fieldValue);		           
		   
		ajax.async = false;		                   			
		
		ajax.post(postData);
		
						
	}	
	
	this.insertNewObject = function(className) {

		var objects;		
		var ajax   = new jsAJAX("");
				
		var ds_cmd = "insertObject";
								
		ajax.url = "?ds=1&ds_className="+escape(className)
				   +"&className="+escape(className)
				   +"&id=0"
		           +"&ds_id=0"
		           +"&ds_cmd="+ds_cmd;		          
		     
		ajax.async=false;
		ajax.get();		                 		    	
		                 		           		           		    
		// ajax.getWithCallbackSync();
		
		var object = ajax.req.responseText.parseJSON();
		return object;
				
	}
	
	
}

// ----------------------------------------------------------------------------------


var __objectArray = new Array();
var __functionArray = new Array();
var __objectArrayIndex=0;

function	jsSafeCallback(obj, fName) {
	
	var myFName;
	
	__objectArrayIndex++;
	
	eval("__functionArray["+__objectArrayIndex+"] = function(e) { "
		+"__objectArray["+__objectArrayIndex+"]."+fName+"(e) "		
		+"} ");		
	__objectArray[__objectArrayIndex] = obj;		
	
	this.myFName = "__objectArray["+__objectArrayIndex+"]."+fName+"()";
	
	
	return __functionArray[__objectArrayIndex];
}

// ----------------------------------------------------------------------------------

function	jsSafeCallbackName(obj, fName) {
	
	var myFName;
	
	__objectArrayIndex++;
	
	eval("__functionArray["+__objectArrayIndex+"] = function() { "
		+"__objectArray["+__objectArrayIndex+"]."+fName+"() "		
		+"} ");		
	__objectArray[__objectArrayIndex] = obj;		
	
	return "__objectArray["+__objectArrayIndex+"]."+fName+"()";

}

// ----------------------------------------------------------------------------------

jsXMLLoader = function() {
	
	var		xmlDoc;
	var		async;
	
	this.async = false;
	
	this.parseDoc = function() {
		
	}
	
	this.parseMSDoc = function() {		
		
		if (this.xmlDoc.readyState == 4) {			
			this.parseDoc();				
		}
	}
	
	this.load = function(url) {
		
		
		
		if (document.implementation && document.implementation.createDocument)
		{
			this.xmlDoc = document.implementation.createDocument("", "", null);				
			this.xmlDoc.onload = jsSafeCallback(this, "parseDoc");		
		}
		else if (window.ActiveXObject)
		{
			
			this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");		
			this.xmlDoc.async = true;
			this.xmlDoc.onreadystatechange = jsSafeCallback(this, "parseMSDoc");
	 	}
		else
		{
			alert('Your browser can\'t handle this script');
			return;
		}	
		
		this.xmlDoc.load(url);
		
		
	}
	
}




/*
Create XML document "out of nowwhere"
*/

function createXMLDoc()
{
	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);
	}
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
 	}
	else
	{
		alert('Your browser can\'t handle this script');
		return;
	}
	return xmlDoc;	
}

// Sleep - funtion in Javascript
Date.ONE_SECOND = 1000
Date.ONE_MINUTE = Date.ONE_SECOND * 60
Date.ONE_HOUR = Date.ONE_MINUTE * 60
Date.ONE_DAY = Date.ONE_HOUR * 24
function nap(m) 
{
	var then = new Date(new Date().getTime() + m); 
	while (new Date() < then) {}
}

// -------------------------------------------------------------------------

function	addEvent(obj, evType, fn, useCapture) {
	if(obj.addEventListener) {
		obj.addEventListener(evType,fn,useCapture);
		return true;
	} else if(obj.attachEvent) {
		var r = obj.attachEvent('on'+evType, fn);
		return r;
	} else {
		obj['on'+evType] = fn;
	}
}

// -------------------------------------------------------------------------

function IsNumeric(sText)
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;   
}

// -------------------------------------------------------------------------

// initalize Date so that it shows also leap years
Date.prototype.leapYear = function ()
{
		var y = this.getFullYear()
		if (((y % 4)==0) && ((y % 100)!=0) || ((y % 400)==0)){return (true)}else{return (false)}
}
Date.prototype.getDaysInMonth = function ()
{
		var daysinmonth = new Array (31,28,31,30,31,30,31,31,30,31,30,31);
		daysinmonth[1] += this.leapYear();
		return daysinmonth[this.getMonth()]
}	

// -------------------------------------------------------------------------
function	changeBg(elemid, bgimage) {
	var f = document.getElementById(elemid);
	f.style.background='url(inc/'+bgimage+') no-repeat';	
	// f.style.backgroundRepeat = "no-repeat";
}

// -------------------------------------------------------------------------

function	sendForm(formId) {
				
	var myform = document.getElementById(formId);
	
	var postStr= '';
	for (i = 0; i < myform.elements.length; i++) {
		var formElem = myform.elements[i];
		switch (formElem.type) {
			case 'select':
	    		var v = formElem.options[formElem.selectedIndex].value;
	    		postStr += formElem.name + '=' + escape(v) + '&'	    							
			break;
			case 'checkbox':
				if(formElem.checked) {
					postStr += formElem.name + '=' + escape(formElem.value) + '&'
				}						
			break;
			
			case 'radio':
				if(formElem.checked) {
					postStr += formElem.name + '=' + escape(formElem.value) + '&'
				}						
			break;			
			
			case 'text':					
			case 'select-one':					
			case 'hidden':					
			case 'password':
			case 'textarea':
			postStr += formElem.name + '=' + escape(formElem.value) + '&'
			break;
		}
	}			

	if(typeof(jsController) != "undefined" ) {	    		
		jsController.execute(postStr);	
	}
	return false;    	
}

// -------------------------------------------------------------------------

function	lahetaLomake(formId) {
				
	var myform = document.getElementById(formId);
	
	var postStr= '';
	for (i = 0; i < myform.elements.length; i++) {
		var formElem = myform.elements[i];
		switch (formElem.type) {
			case 'select':
	    		var v = formElem.options[formElem.selectedIndex].value;
	    		postStr += formElem.name + '=' + escape(v) + '&'	    							
			break;
			case 'checkbox':
				if(formElem.checked) {
					postStr += formElem.name + '=' + escape(formElem.value) + '&'
				}						
			break;
			
			case 'text':					
			case 'select-one':					
			case 'hidden':					
			case 'password':
			case 'textarea':
			postStr += formElem.name + '=' + escape(formElem.value) + '&'
			break;
		}
	}			

	if(typeof(pPageManager) != "undefined" ) {	    		
		if( typeof(pPageManager.formSubmitted) != "undefined") {
			pPageManager.formSubmitted(postStr);	
		}
	}	
	return false;    	
}

// -------------------------------------------------------------------------

function	debug(txt) {
	var d;
	
	// if(debug_off) return;
	
	if(d = document.getElementById("debug")) {
		d.innerHTML = txt+"<br>"+d.innerHTML;
	}
	
}



var IE = document.all?true:false;
if (!IE) document.captureEvents(Event.MOUSEMOVE)

var tempX = 0;
var tempY = 0;

function getMouseXY(e) {
	if (IE) { // grab the x-y pos.s if browser is IE
		tempX = event.clientX + document.body.scrollLeft;
		tempY = event.clientY + document.body.scrollTop;
	}
	else {  // grab the x-y pos.s if browser is NS
		tempX = e.pageX;
		tempY = e.pageY;
	}  
	if (tempX < 0){tempX = 0;}
	if (tempY < 0){tempY = 0;}  
	return true;
}

function getPosX(e) {
	
	var x = 0;
	if (e.offsetParent)
	{
		while (e.offsetParent)
		{
			x += e.offsetLeft
			e = e.offsetParent;
		}
	}
	else if (e.x)
		x += e.x;
	return x;
}

function getPosY(e) {
	var y = 0;
	if (e.offsetParent)
	{
		while (e.offsetParent)
		{
			y += e.offsetTop
			e = e.offsetParent;
		}
	}
	else if (e.y)
		y += e.y;
	return y;
}



// -------------------------------------------------------------------------

parserTree = function() {
	
	this.i=0;
	this.names  = new Array();
	this.values = new Array();
		
	this.pushString = function( name, value ) {				
		this.names[this.i] = name;				
		this.values[this.i] = value;		
		this.i++;
	}
	
	this.findMatches = function( str ) {		
		var list = new Array();
		var a = 0;
		str = str.toLowerCase();
		for(i=0;i<this.names.length;i++) {						
			var s = this.names[i];
			cs = s.toLowerCase();
			if(cs.match(str)) {
				list[a++] = s;				
			}
		}				
		return list;
	}
	
	this.findMatchValue = function( str ) {		
		var list = new Array();
		var a = 0;
		str = str.toLowerCase();
		for(i=0;i<this.names.length;i++) {						
			var s = this.names[i];
			cs = s.toLowerCase();
			if(cs.match(str)) {
				list[a++] = this.values[i];				
			}
		}				
		return list;
	}
	
	
	this.getAll = function() {
		var list = new Array();
		var a = 0;
		for(i=0;i<this.names.length;i++) {						
			var s = this.names[i];
			list[a++] = s;				
		}				
		return list;		
	}
	
}

AutoControl = function(name, optionsdiv, linesid, tree) {
	
	var myControl;
	var id;
	var optid;
	var linesid;
	
	this.id = name;
	this.optid = optionsdiv;
	this.linesid = linesid;
	this.myControl = document.getElementById(name);
	this.tree = tree;
	
	this.setHowerHandler = function( handlerin, handlerout ) {		
		
		var myC   = document.getElementById(this.id);
		myC.itemHowerHandler = handlerin;		
		myC.itemHowerOutHandler = handlerout;		
	}
	
	this.handleKeyDown = function (oEvent) {
		
		var myC   = document.getElementById(this.id);
		var myOpt = document.getElementById(this.optid);	
		
		if(window.event) {
			var key = window.event.keyCode;
		} else {
			var key = oEvent.keyCode;
		}
		
				
	    switch(key) {
		    

		    
	        case 38: //up arrow
	            // alert("UP");
	            // alert(this.id);// .value = "tero";
	            var l = this.tree.findMatches(myC.value);
	            this.maxSelect = l.length-1;
	            if( 0 < this.selectedIndex) {
		            if(!this.pass) {
	            		this.selectedIndex--;
	            		this.fillOptions(l);
	            		this.pass =1;
            		} else {
            			this.pass =0;
        			}
            	}
	            	            
	            break;
	        case 40: //down arrow
	            // alert("Down");	        
	            var l = this.tree.findMatches(myC.value);
	            this.maxSelect = l.length-1;
	            if(this.maxSelect > this.selectedIndex) {
		            if(!this.pass) {
	            		this.selectedIndex++;
	            		this.fillOptions(l);
	            		this.pass = 1;
            		} else {
	            		this.pass = 0;
	            	}
            	}
	            break;
	        case 13: //enter
	        
	        	if(myOpt.style.visibility == "visible") {
		        	alert(this.value);
	            	if(!this.pass) {	            	
		            	if(this.editMode) {			            	
			            	this.updateLine(this.value);
		            	} else {
	            			this.addLine(this.value);
            		     }
            		}
            		this.pass = 0;		        	
	        	} else {
	            	var l = this.tree.findMatches(myC.value);	            
	            	if( l.length > 0 && (this.selectedIndex >=0)) {
	            		this.value = l[this.selectedIndex];
	            		this.selectedIndex = -1;	            	
	            		this.pass = 1;
            		} else {
	            		if(!this.pass) {
		            	
		            	if(this.editMode) {			            	
			            	this.updateLine(this.value);
		            	} else {
	            			this.addLine(this.value);
            			}
            			}
            			this.pass = 0;
	            	}	    
            	}    
            	myOpt.className ="selectBoxHidden";
            	this.clearOptions();
            	return false;
	            break;
	            
	        default:
	        
		    	if(key<20) 	return true;
		    	
	        	var l = this.tree.findMatches(myC.value);
	            if(l.length > 0) {		            
	            	// myC.style.backgroundColor = "#ffee44";
	            	myOpt.className ="selectBoxVisible";
	            	this.fillOptions(l);
	            	this.maxSelect = l.length-1;
            	} 
            	if( (l.length == 0) || (this.value.length==0)) {
	            	myOpt.className ="selectBoxHidden";	            	
					myC.style.backgroundColor = "#ffffff";	            	
					this.maxSelect = -1;
	            }
	            break;
	    }
	    
	};	
	
	this.updateLine = function() {		
	}
	
	this.addLine = function() {
	}
	
	this.updateLines = function() {
	}
	
	this.displayEdit = function(index) {
					
	}
	
	this.hide = function(e) {
		

		if(e.srcElement) {
			obj = e.srcElement;
		}
		
		if(e.target) {
			obj = e.target;
		}		
		
		var myC   = document.getElementById(obj.id);
		var myOpt = document.getElementById(obj.optid);	
		
		if(myOpt.style.visibility == "visible") {				
			myOpt.style.visibility = "hidden";
		}
	}
	
	this.clearOptions = function(list) {
		
		var myOpt = document.getElementById(this.optid);	
		var html = "";
		myOpt.innerHTML = html;
	}	
	
	
	this.fillOptions = function(list) {
		
		var myOpt = document.getElementById(this.optid);	
		var html = "";
		
		myOpt.style.left = getPosX(this);
		myOpt.style.top  = getPosY(this)+24;
		
		myOpt.innerHTML = "";				
		for(i=0;i<list.length;i++) {
			html += "<div id='s"+i+"'>"+list[i]+"</div>";
		}
				
		myOpt.innerHTML = html;
		
		for(i=0;i<list.length;i++) {
			d = document.getElementById('s'+i);
			if(i==this.selectedIndex) {
				d.className = 'selected';
				d.isSelected = 1;
			} else {
				d.className = 'notselected';
				
			}			
			d.index = i;
			d.cid = this.id;
			d.optid = this.optid;
			
		    if(d.addEventListener) {	    		
				d.addEventListener('click',this.selClick,false)
			}
	
			// add event Microsoft way
    		if(d.attachEvent) {	  
				d.attachEvent('onclick',this.selClick)
			}
			
			// d.onclick = this.selClick;
			
			d.onmouseover = function() {
				this.oldClass = this.className
				this.className = "selHover";
			}

			d.onmouseout = function() {
				this.className = this.oldClass;
				if(this.isSelected) {
					this.className = "selected";
				} else {
					this.className = "noselected";
				}
			}
						
		}		
	}
	
	this.selClick = function(e) {
		
		
		
		if(e.srcElement) {
			obj = e.srcElement;
		}
		
		if(e.target) {
			obj = e.target;
		}
		
		var myOpt = document.getElementById(obj.optid);	
		var myC   = document.getElementById(obj.cid);			


        var  l = myC.tree.findMatches(myC.value);

        var  maxSelect = l.length-1;
        if(  obj.index <= maxSelect) {
	        

	        myC.value = l[obj.index];
	        
	        myC.selectedIndex = -1;
        	myOpt.className ="selectBoxHidden";
        	myC.clearOptions();
    	}
    	
	}
	
	this.clickHandler = function(e) {

		if(this.value.length == 0) {
			
			if(this.secondClick) {
				l= this.tree.getAll();
				var myOpt = document.getElementById(this.optid);	
           		myOpt.className ="selectBoxVisible";
           		this.fillOptions(l);
           		this.maxSelect = l.length-1;
       		}
       		       		
       		this.secondClick = 1;
		}
	}
		
	this.myControl.onkeydown = this.handleKeyDown;
	this.myControl.onkeyup = this.handleKeyDown;	
	this.myControl.onclick = this.clickHandler;	
	
	this.myControl.optid = this.optid;
	this.myControl.myControl = this.myControl;
	
	this.myControl.fillOptions = this.fillOptions;
	this.myControl.selClick = this.selClick;
	this.myControl.linesid = this.linesid;
	this.myControl.addLine = this.addLine;
	this.myControl.updateLines = this.updateLines;
	this.myControl.updateLine  = this.updateLine;
	this.myControl.displayEdit = this.displayEdit;
	this.myControl.clearOptions = this.clearOptions;
	this.myControl.hide = this.hide;
	
	this.myControl.setHowerHandler = this.setHowerHandler;
	
	
	this.myControl.lineindex = 0;
	this.myControl.selectedIndex = -1;
	this.myControl.maxSelect = -1;
	this.myControl.tree = tree;
	
	/*
    if(this.myControl.addEventListener) {	    		
		this.myControl.addEventListener('blur',this.hide,false)
	}

	// add event Microsoft way
	if(this.myControl.attachEvent) {	  
		this.myControl.attachEvent('onblur',this.hide)
	}
	*/
	
}



// -------------------------------------------------------------------------

// style: 
// table = caltable
// row   = calrow
// td    = calcell
// a     = callink


clDateTimePicker = function(myId, inputId, imageId) {
	
	
	var alwaysVisible;
	var dateChange;
	
	
		
	this.getHtml = function () {					
				
		return "<table class='caltable' bgcolor=white>"+this.html+"</tr></table>";		
	}
	
	this.addRow = function() {			
		if(this.rows > 0) this.html+="</tr>";
		this.html += "<tr class='calrow'>";
		this.rows++;
	}
	
	this.addCell = function(str) {	
		this.html += "<td class='calcell'>"+str+"</td>";
	}
	
	this.action = function(strName, strValue) {
		
		if(strName=="closeMe") {
			if(!this.alwaysVisible) {
				oDiv = document.getElementById(this.id);
				oDiv.style.visibility = "hidden";
			}
			return;
		}		
		
		if(strName=="PrevYear") this.year--;		
		if(strName=="NextYear") this.year++;		
		if(strName=="PrevMonth") this.month--;		
		if(strName=="NextMonth") this.month++;		
		
		if(this.month < 0) {
			this.month =11;
			this.year--;
		}
		if(this.month >= 12) {
			this.month =0;
			this.year++;
		}
		
		if(strName=="DateSelected") {
			var oInput;
			var oDiv;
			oInput = document.getElementById(this.inputId);
			oInput.value = strValue+"."+(this.month+1)+"."+this.year;
			
			if(!this.alwaysVisible) {
				oDiv = document.getElementById(this.id);
				oDiv.style.visibility = "hidden";
								
				if(this.dateChange) {
					this.dateChange(this.year, this.month+1, strValue);
				}
			}
		}
		this.refresh();
	}
		
	this.addAction = function(strAction, strName, strValue) {
		
		var aStr = "document.getElementById(\""+this.id+"\").calendar.action(\""+strAction+"\", \""+strValue+"\")";		
		this.html += "<td class='calcell'><a class='callink' href='javascript:"+aStr+"'>"+strName+"</a></td>";
	}
	
	this.refresh = function() {	
			
		
		var m;		
		m = new Array();
		
		
		
		m[0] = "Tammikuu";
		m[1] = "Helmikuu";
		m[2] = "Maaliskuu";
		m[3] = "Huhtikuu";
		m[4] = "Toukokuu";
		m[5] = "Kesäkuu";
		m[6] = "Heinäkuu";
		m[7] = "Elokuu";
		m[8] = "Syyskuu";
		m[9] = "Lokakuu";
		m[10] = "Marraskuu";
		m[11] = "Joulukuu";		
		
		
				
		
		var d;
	
		this.html = "";	
		this.rows = 0;
			
		var day;
		var b;
		
		day = new Date();	
		
		// alert("Here");
		
		
		
		this.html+="<tr><td colspan=7><table width=100%><tr>";
		
		// this.addAction("PrevYear", "<<");
		this.addAction("PrevMonth", "<<");
		this.html+="<td align=center class='calhead'>"+m[this.month]+" "+this.year+"</td>";
		this.addAction("NextMonth", ">>");
		this.addAction("closeMe", "x");
		//this.addAction("NextYear", ">>");
		this.html+="</tr></table></td></tr>";
		
		this.addRow();
		
	    d  = new Date( this.year,this.month,1);
	    firstDay =  d.getDay();
	    lastDay = d.getDaysInMonth();	
	    if(firstDay == 0) firstDay = 7;
	    
	    this.addCell("Ma");		
	    this.addCell("Ti");		
	    this.addCell("Ke");		
	    this.addCell("To");		
	    this.addCell("Pe");		
	    this.addCell("La");		
	    this.addCell("Su");		
	    
	    this.addRow();
	    
	    
	    
	    
		dNro = 1;
		for(i=1; i<=6*7; i++) {	
			
			if(i >= firstDay) {			
							
				if( dNro <= lastDay) {
					this.addAction("DateSelected", i-firstDay+1, i-firstDay+1 );		
					dNro++;	
				}			
			} else {
				this.addCell("");		
			}
			if(i%7==0) this.addRow();
		}
		
		
		
		
		myId = this.id;		
		// myId = "cal";
		myDiv = document.getElementById(myId);
		
		
		// alert(myId);
		
		this.layer = myDiv;
		/*
		if(!this.layer) {
			
			this.id = this.id + "oma";
						
    		this.layer = document.createElement("div");
    		this.layer.id = this.id;
    		this.layer.className = "suggestions";
    		this.layer.style.position = "absolute";
    		this.layer.style.visibility = "hidden";
    		this.layer.style.left = "100px";
    		this.layer.style.top  = "10px";    		
    		this.layer.calendar = this;
    		document.body.appendChild(this.layer);			
		}
		*/
		
		
		html = this.getHtml();
		
		this.layer.innerHTML = html;
		
		
		return;
				
	}
	
	this.setVisible = function(e) {

		
		
		if (!e) var e = window.event;		
		
		var oDiv;		
		
		// W3C way
		if(e.srcElement) {
			oDiv = document.getElementById(e.srcElement.calendar.id);			
			inputId = e.srcElement.calendar.inputId;
			imageId = e.srcElement.calendar.inputId;
		}
		
		// Microsoft way
		if(e.target) {
			oDiv = document.getElementById(e.target.calendar.id);			
			inputId = e.target.calendar.inputId;
			imageId = e.target.calendar.imageId;
		}
		
		
		
		oDiv.style.visibility = "visible";
		
		// getElementY		
		iDiv = document.getElementById(imageId);
		
		
		oDiv.style.left = parseInt( getPosX(iDiv))+ "px";
		oDiv.style.top =  parseInt( getPosY(iDiv))+ "px";
		
		
						
	}
	
	today = new Date();
	
	this.year = today.getFullYear();
	this.month = today.getMonth();
	
	this.id = myId;		
	this.myId = myId;
	this.inputId = inputId;
	this.imageId = imageId;
	
	var myDiv;
	
	myDiv = document.getElementById(myId);
	myDiv.calendar = this;
	myDiv.style.visibility = "hidden";
	
	var myPic;
	var aStr;
	
	myPic = document.getElementById(imageId);
	
	
	
	
    // add event listener to calendar image, W3C way	
    if(myPic.addEventListener) {
	    myPic.calendar = this;
		myPic.addEventListener('click',this.setVisible,false)
	}
	
	// add event listener to calendar image, Microsoft way
    if(myPic.attachEvent) {
	    myPic.calendar = this;
		myPic.attachEvent('onclick',this.setVisible)
	}
	
	
}


//------------------------------------------------------------------------------------------

startDrag = function(ev) {
		var target = window.event ? window.event.srcElement : ev ? ev.target : null;
		dc.dragObject  = target;									
	
		dc.mouseOffset = dc.getMouseOffset(target, ev);
		
		var pos = dc.getPosition(target);
		
		dc.origDelta = new Array();
				
		dc.origDelta.x = pos.x - parseInt(target.style.left);
		dc.origDelta.y = pos.y - parseInt(target.style.top);
		
		return false;		
}

childDrag = function(ev) {
	
		var target = window.event ? window.event.srcElement : ev ? ev.target : null;
		
		while(target.parentNode) {			
			if(target.parentNode.startDrag) {
				target.parentNode.startDrag(target.parentNode);
				return;				
			}		
			target = target.parentNode;
		}
}



dragControl = function() {
	
	var mousePos = new Array();
	var mouseOffset = new Array();
	var origDelta   = new Array();
	var dragObject;	
	var dragFunc;
	
	var draggableItems;
	
	this.draggableItems = new Array();
	
	
	
	this.dragObject = null;
	
	this.mouseDown = function(ev){
		return;
	}
	
	this.mouseMove = function(ev){
		
		ev           = ev || window.event;
		var mousePos = dc.mouseCoords(ev);
		
		
		// if(drawMode > 0) return;
		

		
		if(dc.dragObject){
			
			if(dc.dragObject.nodeName=="INPUT") return;
			if(dc.dragObject.nodeName=="TEXTAREA") return;			
			
			
			debug("moving :"+dc.dragObject.id);
			
			//d = document.getElementById("dragtest");
			//d.innerHTML =dc.mouseOffset.x+","+dc.mouseOffset.y+" : "+mousePos.x+","+mousePos.y;		
			
			
			if(!dc.draggableItems[dc.dragObject.id]) { 
				// perhaps the parent should be moved
				
				var parent = dc.dragObject.parentNode;
				
				debug("Parent:"+parent.id);
				
				parent.style.position = 'absolute';
				parent.style.top      = (mousePos.y - dc.mouseOffset.y -dc.origDelta.y)+"px";
				parent.style.left     = (mousePos.x - dc.mouseOffset.x -dc.origDelta.x)+"px";	
				
				//dc.dragObject.style.top      = (mousePos.y - dc.mouseOffset.y -dc.origDelta.y)+"px";
				//dc.dragObject.style.left     = (mousePos.x - dc.mouseOffset.x -dc.origDelta.x)+"px";	
				
				
				return true;
				//dc.dragObject.style.position = 'absolute';
				//dc.dragObject.style.top      = (mousePos.y - dc.mouseOffset.y -dc.origDelta.y)+"px";
				//dc.dragObject.style.left     = (mousePos.x - dc.mouseOffset.x -dc.origDelta.x)+"px";	
				
				
				
			} else {
			
				// dc.dragObject.style.position = 'absolute';
				dc.dragObject.style.top      = (mousePos.y - dc.mouseOffset.y -dc.origDelta.y)+"px";
				dc.dragObject.style.left     = (mousePos.x - dc.mouseOffset.x -dc.origDelta.x)+"px";	
				
				// d.innerHTML +=mousePos.y;		
				
				if(dc.dragFunc) {								
					dc.dragFunc();
				}		
			}
								
			return false;
		}		
		
		
	}
	
	
	this.mouseDown = function(ev){
		
	}
			
	this.mouseUp = function(ev){		
		
		if(dc.dragObject && dc.dropFunc) {		
			dc.dropFunc();
		}
		dc.dragObject = null;		
	}
	
	this.getMouseOffset = function (target, ev){
		ev = ev || window.event;
		
		var docPos    = dc.getPosition(target);
		var mousePos  = dc.mouseCoords(ev);
				
		return {x:(mousePos.x - docPos.x), y:(mousePos.y - docPos.y)};
	}	
	
	this.makeDraggable = function(item){
		
		if(!item) return;
		
		if(!item.id) return;
		
		item.startDrag = startDrag;
		
		this.draggableItems[item.id] = 1;
		
		
		
		
		// alert(item.childNodes.length);
		
		/*
		addEvent(item, 'mouseover', function(ev) {
			return true;
			}, false); */
		
		addEvent(item, 'mousedown', function(ev) {
					var target = window.event ? window.event.srcElement : ev ? ev.target : null;	
					
					if(!dc.dragObject) {
						
						if(target.id) {
									dc.dragObject  = target;																		
									dc.mouseOffset = dc.getMouseOffset(target, ev);									
									var pos = dc.getPosition(target);										
									dc.origDelta = new Array();										
									dc.origDelta.x = pos.x - parseInt(target.style.left);
									dc.origDelta.y = pos.y - parseInt(target.style.top);
									return true;
						} else if(target.parentNode.id) {							
							target = target.parentNode;
							dc.dragObject  = target;																		
							dc.mouseOffset = dc.getMouseOffset(target, ev);									
							var pos = dc.getPosition(target);										
							dc.origDelta = new Array();										
							dc.origDelta.x = pos.x - parseInt(target.style.left);
							dc.origDelta.y = pos.y - parseInt(target.style.top);
							return true;							
							
						}
																		
					}

					return true;			
				}, false);
		
		
		/*
		for(var i=0; i<item.childNodes.length; i++) {
			
			
			addEvent(item.childNodes[i], 'mouseout', function(ev) {
					return true;
			}, false);
			
			addEvent(item.childNodes[i], 'mousedown', function(ev) {
											
				
									// IE + Mozilla compatible way
									var target = window.event ? window.event.srcElement : ev ? ev.target : null;									
									
									// alert(target.parentNode);
									
									// alert(target.parentNode.id);
									
									//if(target.parentNode.id) {								
									
									dc.dragObject  = target.parentNode;																		
									dc.mouseOffset = dc.getMouseOffset(target.parentNode, ev);									
									var pos = dc.getPosition(target.parentNode);										
									dc.origDelta = new Array();										
									dc.origDelta.x = pos.x - parseInt(target.parentNode.style.left);
									dc.origDelta.y = pos.y - parseInt(target.parentNode.style.top);
									return true;
									
									//}
									
									return false;			
									}, false);
			
			

		}
		*/

		
		addEvent(item, 'mousemove', function(ev) {
			return true;
		}, false);

		/*		
		addEvent(item, 'mousedown', function(ev) {
			
									// IE + Mozilla compatible way
									var target = window.event ? window.event.srcElement : ev ? ev.target : null;
									
									return true;
										
									// alert(target);							
									if(!dc.dragObject) {																		
										
										if(target.id) {										
											dc.dragObject  = target;																	
											dc.mouseOffset = dc.getMouseOffset(target, ev);									
											var pos = dc.getPosition(target);									
											dc.origDelta = new Array();									
											dc.origDelta.x = pos.x - parseInt(target.style.left);
											dc.origDelta.y = pos.y - parseInt(target.style.top);
										}
									} else {
										alert(dc.dragObject);
									}
									return true; 
									
									}, false);*/
																										
	}	
		
	this.mouseCoords = function (ev){
		if(ev.pageX || ev.pageY){
			return {x:ev.pageX, y:ev.pageY};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	}	
	
	this.mouseAbsCoords = function (ev){
		
		if(ev.pageX || ev.pageY){
			
			// return {x:(ev.pageX+ document.body.scrollLeft), y:(ev.pageY+ document.body.scrollTop)};			
			return {x:(ev.pageX), y:(ev.pageY)};			
		}
		
		return {
			
			x:ev.clientX,
			y:ev.clientY + document.documentElement.scrollTop
		};
	}	
	
	
	this.getPosition = function(e){
		var left = 0;
		var top  = 0;
		
	
		while (e.offsetParent){
			left += e.offsetLeft;
			top  += e.offsetTop;
			e     = e.offsetParent;
		}
			
		left += e.offsetLeft;
		top  += e.offsetTop;
	
		return {x:left, y:top};
	}			
}





