/*** NOTES June 15 2006

THIS WORKS BUT WE NEED TO TEAR OUT A LOT OF OBSOLETE CODE

see blog_forum_common.js.dtml for code commoin with blog view

***/

var g_iframeEditingDocObj, g_editPaneSubmit, g_editPaneCancel ;
function registerIframe(docRef){

    g_iframeEditingDocObj = docRef
    g_editForm = g_iframeEditingDocObj.edit_form 

    if (g_editForm) {    
        var newEl=docRef.createElement('input');
        newEl.setAttribute('type','hidden');
        newEl.setAttribute('name', 'template');
        newEl.setAttribute('value','weblog_dataonly_template');
        g_editForm.appendChild(newEl);
        g_editForm.target = '_top'
        if (g_editForm['form.button.Save']) g_editPaneSubmit = g_editForm['form.button.Save']
        if (g_editForm['form.button.Cancel']) g_editPaneCancel = g_editForm['form.button.Cancel']
    }
}

/*** below ought to be in the edit verson of the js **/

function saveEdit(){
    if (g_editPaneSubmit){
        g_editPaneSubmit.click() /// ought to try simple js validation to force a title
    }
    else{
        alert('could not submit the form.  please try the Save button at the bottom of the form itself')
    }
}

// the special character is ||||||||||

//  alert(6)


////// gdgd() line 19 ie5 mac line 2 iewin
var isEditing = false;
var objMetadata = new Array();
var g_expandableItems = new Array ();
var g_cbEls = new Array()
var olImgHs = new Array()
var g_insel = false;
var g_titleStrings = new Array()
var g_portal_url = portal_url ? portal_url : getPortalUrl()
g_titleStrings['folderishIcon'] = 'Click to view a listing of replies & attachments in-place as a collapsible tree, without reloading the page'
g_titleStrings['folderToggler'] = 'Click to collapse or expand this listing of replies & attachments, without reloading'
g_titleStrings['objectIcon'] = 'Click to open this item, replacing the current page contents'


g_nowrapArgName = 'nowrap'; // 'plone_skin'
g_nowrapArgVal = 'true';    // 'KNFastFolders'

g_nowrapArgStr = g_nowrapArgName + '=' + g_nowrapArgVal;


olImgHs['none'] = 12
olImgHs['block'] = 10

var tabBarClass = new Array()

tabBarClass['none'] = 'bar';
tabBarClass['block'] = 'barExpanded';

var g_defaultItemDisplay = 'none';
var g_firstToggleDisplay = 'block';
var hackSpacerStr = '..';

function getPortalUrl() {
    var dl = new String(document.location);
    var arr=dl.split("/")
    if(arr[2].indexOf(":")>=0)
       var portal_url = arr[0]+"//"+arr[2]+"/"+arr[3]
    else
       var portal_url = arr[0]+"//"+arr[2]
    return portal_url
}

for (var i = 0; i < 70; i++) { hackSpacerStr += ' ..'; }

function init(){
	
//	var t1 = new Date().getTime()
	addTogglers();
//	var t2 = new Date().getTime()
	
//	alert(Math.round((t2-t1)/root.cn.length))
}


////// OBJECTS - will bring in editing methods later

var root = null, curObj = null;

function addSub(domObj){
	var jsObj
	if (root){
		jsObj = new RowObj(domObj)
		curObj.cn[curObj.cn.length] = jsObj
	}else{
		root = new RootObj(domObj)
		curObj = root;
		jsObj = root;
	}
	return jsObj;
	
}

function EditBase(domObj){	// stub.. overwritten in edit scripts

}

function detailRender(){	// stub.. overwritten in edit scripts

}

function interpretPerms(){  // stub over-ridden in edit.js

}

function Base(domObj) {		// common atts & methods - traverses dom for initial data

//   var XXXXXXX = new Date()	
	while (domObj.parentNode && domObj.className != 'item'){
		if ((domObj.className == 'bar') || (domObj.className == 'barExpanded')) this.tabCellObj = domObj;
		if (domObj.className == 'itemheadTbl') this.tableHeadObj = domObj;		
		domObj = domObj.parentNode;
	}
	
	var tables = filterForClass('itemDetail', domObj.childNodes);
	var subs = filterForClass('subs', domObj.childNodes);
		
	if(subs.length > 0 ) this.subsDiv = subs[0];
	
	if (tables.length > 0) {
		this.mdTable = tables[0];
		this.mdTable.jsObj = this;
	}
	
	domObj.jsObj = this;
	this.parentObj = curObj;

	this.interpretPerms = interpretPerms;
	

	if (curObj){  // root obj excepted;
		this.index = curObj.cn.length;
		this.path = curObj.path + '.cn[' + this.index + ']'
	}
	
	if (curObj && curObj.subsMD){ // try to use MD from data fetch cycle
		this.MD = curObj.subsMD[this.index];
	}else{
        this.MD = new Object();
        this.MD.rowRender = rowRender;
        this.MD.detailRender = detailRender;
        this.MD.ffolderIcon = ffolderIcon;
        var kindCell = filterForClass('kind', domObj.getElementsByTagName('td'), true)
        if (kindCell){
             this.MD.medium = kindCell.innerHTML;
             
             this.MD.isDiscussion = (this.MD.medium.indexOf('Discussion ') > -1) || (this.MD.medium.indexOf('log Entry')> -1);
             this.MD.isBlog = (this.MD.medium.indexOf('log Entry')> -1);
             // NB SHOULD REPLACE WITH AN AD-HOC ATTRIBUTE SNIFF -s o can re-use kind column
        }
        this.kindCell = kindCell; // mim july 15 04; use this for quickview link
        
        var sizeCell = filterForClass('size', domObj.getElementsByTagName('td'), true)
        if (sizeCell){
            this.sizeCell = sizeCell;
            this.MD.sizeStr = sizeCell.innerHTML;
            this.MD.hasAttachments = this.MD.sizeStr.indexOf('resource') > -1;
        }
        
        this.dateCell = filterForClass('when', domObj.getElementsByTagName('td'), true)
		this.isNews = this.MD.medium.indexOf('RSS Feed') > -1;
		
		if (this.isNews){
			this.folderIcon = 'rss';
			this.fetchContents = fetchNewsFeed;
		}
		
		if(this.MD.folderIconName) {    // over-ride gubbins above; let python tell us folder-icon
		    this.folderIcon = this.MD.folderIconName; // ** remember to remove gubbins above if this works :)
		}
	}
	
	this.domObj = domObj;
	this.objID = domObj.getAttribute('id');
	
	if (curObj){  // root obj excepted;
		this.idPath = (curObj.idPath == '' ? '' : (curObj.idPath + '/')) + this.objID
	}
	
    this.ownerID = domObj.getAttribute('kn:author');


	if (this.objID == 'topDetail') this.objID = domObj.getAttribute('kn:objID');
	
	
	//this.editPermsStr = domObj.getAttribute('kn:perms')
	//this.allowedTypes = domObj.getAttribute('kn:types')
	
	
	var aObj = filterForType('a', this.tabCellObj.childNodes), url;
	
	if (aObj.length > 0){
		aObj = aObj[0];
		url = aObj.getAttribute('href')
		
		this.url = url
		this.viewURL = url.split('/blog_forum').join('')
		this.isFolder = (url.indexOf('/fast_folders') >= 0)
		                  || (url.indexOf('/fast_forums') >= 0)
		                  || (url.indexOf('/blog_forum') >= 0)
		                  || this.MD.isDiscussion


		this.EditBase = EditBase;	//	wait until we know whether it is a folder before asking for extra methods
		
		this.EditBase(domObj)
		
        this.interpretPerms()
        		
		if (this.isFolder){
			this.cn = new Array();
			if (this.MD.isDiscussion) {
                this.fetchContents = fetchContents;
//                this.viewURL = url.split('/fast_folders').join('')
//                this.viewURL = this.viewURL.split('/fast_forums').join('')
			    if (this.MD.isBlog){
			        this.folderIcon = this.MD.hasAttachments ? 'blogentry_attach' : 'blogentry';
			    }else{
                    this.folderIcon = this.MD.hasAttachments ? 'discussion_attach' : 'discussion';
                }
			}else {
                this.folderIcon = 'small_olFolder';
                this.fetchContents = fetchContents;
                this.viewURL = url.split('/fast_folders').join('')
            }
            if(this.MD.folderIconName) {    // over-ride gubbins above; let python tell us folder-icon
                this.folderIcon = this.MD.folderIconName; // ** remember to remove gubbins above if this works :)
            }
		}

        if ( this.kindCell ) {
            var viewLinkS = '<a href="'
                + this.viewURL
                + '" title="Click to view this content">' + this.kindCell.innerHTML + '</a>';
            this.kindCell.innerHTML = viewLinkS;
        }
        
		this.title = aObj.firstChild.data
		this.titleAObj = aObj;
		this.MD.title = this.title
		
		
		/////// !!!!!!!! NB - JULY 14 04 - MUST MAKE SURE TO HAVE THE PORTAL_URL JS VAR AVAILABLE IN LINE BELOW!!!
		//// oct 04 - portal_url *is* always available; use it to check for away links??? - but no bm types here
		this.awayLink = false;
		//////!!! hack july 14 04 /// ((url.toLowerCase().indexOf(':') > -1) && (url.toLowerCase().indexOf('http://www.theknownet.com') < 0))
		
		this.iconURL = (this.isFolder || this.isNews) ? "javascript:void(" + this.path + ".toggleOL())" : url
		
		this.defaultTarget = this.isFolder ? false : '_top'; /// oct 04 no longer in framesets byt leave in in case
//		this.defaultTarget = this.awayLink ? ' target = "_top"' : false;
	}
	if (isEditing) {
		if(this.mdTable){	// add the toolbar
			var tbDiv = document.createElement('div')
			tbDiv.className = 'tb';
			tbDiv.innerHTML = this.tbStr();
			var temp = filterForClass('descr_cell', this.mdTable.getElementsByTagName('td'), true)
			this.descr_cell = temp
			if (temp) temp.insertBefore(tbDiv, temp.childNodes[0]);
		}
		
		
		
	}

	if (this.tableHeadObj){
		var iconCell = filterForClass('iconcell', this.tableHeadObj.getElementsByTagName('td'))
		this.iconCell = iconCell;
		if (iconCell.length > 0){
			iconCell = iconCell[0];
			var imgs = filterForType('img',iconCell.childNodes)
			if (imgs.length > 0) imgs = imgs[0];
			this.icon = imgs;
			if(this.isNews) this.icon.src = '/knotes_ui_imgs/rss_closed.gif'
			
			if(true){	//	(document.cookie.indexOf('old3') > -1) || (document.cookie.indexOf('479') > -1) || (document.location.protocol.indexOf('ile') > -1) ){
				if (this.iconURL){
					var newA = document.createElement("a")
					newA.setAttribute("href",this.iconURL);
					newA.setAttribute("title",(this.isFolder ? g_titleStrings['folderishIcon'] : g_titleStrings['objectIcon']));
					if (this.defaultTarget) newA.setAttribute("target", this.defaultTarget);	
					iconCell.removeChild(imgs)
					newA.appendChild(imgs)
					iconCell.appendChild(newA)
					this.iconLink = newA // so the title can be changed later
				}
			}
		}
	}
	this.loaded = loadedSubobj;
	this.toggleOL = toggleOL;
	this.scrollIntoView = scrollIntoView;
	
//   alert(new Date() - XXXXXXX)

}

function RootObj(domObj) {

	this.path = 'root'
	this.idPath = ''
	this.base = Base;
	this.base(domObj);
	
	
	this.isFolder = true;
	this.cn = new Array();
    this.hasBeenOpened = true;

	this.toggleOL = stub;
	this.loaded = loadedRoot;
	
	root = this;
}

function RowObj(domObj) {

	this.base = Base;
	this.base(domObj);

}

function stub(){}

function toggleItems(domObj){

	toggleOneItem(domObj, false)
}

var g_toggleEditSafHackNexpanded = 0;


function toggleOneItem(domObj, state) { /// should make this a method and havd obj scroll itself into view afterwards

	var imgObjs = filterForType('img', domObj.childNodes)
	var tdObj = domObj;
	
	while (domObj.parentNode && domObj.className != 'item'){
		domObj = domObj.parentNode;
		if ((domObj.className == 'bar') || (domObj.className == 'barExpanded')) tdObj = domObj;
	}
	if (domObj.className != 'item') return false;
	
	var subdivs = filterForType('table', domObj.childNodes), itemDiv;
	
	if (subdivs.length > 1) {
		itemDiv = subdivs[1]
		var newDisplay = (itemDiv.style.display == g_firstToggleDisplay ) ? g_defaultItemDisplay : g_firstToggleDisplay;

		if ( state ) newDisplay = state;
		itemDiv.style.display = newDisplay;

		imgObjs[0].src = g_portal_url+'/knotes_ui_imgs/ol_' + newDisplay + '.gif';
		imgObjs[0].height = olImgHs[newDisplay];
		if ( tdObj ) tdObj.className = tabBarClass[newDisplay]; /// should make a complementary class w border etc
		
		g_toggleEditSafHackNexpanded += (newDisplay == 'block') ? 1 : -1;


//		window.scrollTo(0,0);
	}
	
}

var g_hasMadeDomObjs = false;


function addTogglers(){

	if (g_hasMadeDomObjs) return;
	
	if (document.getElementById('topItemToggler')){
       g_expandableItems[0] = document.getElementById('topItemToggler');
       toggleItems(g_expandableItems[0])
    }

	if (document.getElementById){
		addTogglersInObj(document, root)
		if (isDiscussion){
		  if (root.cn.length < 4){
		      expandAll()
		  }
		}
		var bannerIcons = bannerAs// + (isEditing ? editA : loginA)
		if (checkCB && checkCB()) cb_A = cb_A.split('style="display:none;" ').join('style="display:block;"')
        if (isEditing) bannerIcons += cb_A;


		document.getElementById('bannerIcons').innerHTML = bannerIcons;
		if (isEditing){
		
			var sels = document.createElement('div')
			sels.id = 'editExtrHTML';
			sels.innerHTML = createActionMenus()
			
			document.getElementById('folders').appendChild(sels)
//			document.getElementById('editExtrHTML').innerHTML = '<form><textarea cols=80 rows=10>'+createActionMenus()+'</textarea></form>'
		}
	}
	g_hasMadeDomObjs = true;
	
	
}

function addTogglersInObj(obj, jsObj){

	var itemHeads = filterForClass('bar',obj.getElementsByTagName('td')), oneItem, jsObj
	
	curObj = jsObj;
	for (var i = 0; i < itemHeads.length; i++){
		oneItem = itemHeads[i]
		jsObj = addSub(oneItem)
		addOneToggler(oneItem, jsObj)
		addOneToolBar(jsObj)
	}
	
}

/////////////


function addOneToolBar(jsObj){  // adding in trials june 11 06 - bring back the good old toolbars for js-writeen and tal-written items!

    var itemEl = jsObj.domObj
    
    if (thisID == jsObj.objID){     // skip the top-level first object; it's covered statically
        return 0
    }
    
    var meatEl = filterForClass('discMeat', itemEl.getElementsByTagName('div'),1)
    
    if (meatEl && userName){
    
        var canEditPost = (jsObj.ownerID == userName) || canEdit
        var s = oneEditLinksStr(canEditPost, jsObj.idPath, jsObj.MD.title)
        s = s.split('*ZID*').join(jsObj.idPath)
        var curHTML = meatEl.innerHTML

        meatEl.innerHTML = s + curHTML
        
    }
    return 1
}

/////////////


function oneEditLinksStr(canEditThis, id, title) { // stub overridden in edit scripts, called in addLinksToPosted
    return ''
}

var hackIEid = 0;



function dump(obj, nocode){
	var s = ''
	for (var i in obj){
		var ss = ' ' + obj[i]
		if (nocode && ss.indexOf ('code') > -1){}
		else{
			s += 'obj.' + i + ' = ' + obj[i] + '\r';
		}
	}
	alert(s)
}

function addOneToggler(obj, jsObj){


	var childObj = document.createElement("a");
	if (document.all){///// && childObj.attachEvent){
		var id = 'hackID_' + hackIEid++;
		childObj.setAttribute("id", id)
		childObj.setAttribute("href","javascript:void(ieHackToggleEvt('" + id + "'))"); // ieHackToggleEvt())");
	
	}else{
		childObj.setAttribute("href","click_to_show_or_hide_this_item");	//	javascript:void(ieHackToggleEvt())");
		childObj.setAttribute("onclick","toggleItems(this); return false")
	}
	
	childObj.className = "toggle";
	
	var childIMGObj = document.createElement("img");
	childIMGObj.setAttribute("src",g_portal_url+"/knotes_ui_imgs/ol_" + g_defaultItemDisplay + ".gif");
	childIMGObj.setAttribute("alt","show or hide details for this item");
	childIMGObj.setAttribute("width",10);
	childIMGObj.setAttribute("height",olImgHs[g_defaultItemDisplay]);
	childIMGObj.setAttribute("border",0);
	childObj.jsObj = jsObj
	
	childObj.appendChild(childIMGObj)
	
	
	obj.insertBefore(childObj, obj.childNodes[0])
	
	
/////////	if (jsObj.parentObj) alert(jsObj.path + '.parentObj = ' + jsObj.parentObj.path)
	
//////	if (jsObj.parentObj) alert ('jsObj.parentObj.MD.title = ' + jsObj.parentObj.MD.title)
	

	if (jsObj.parentObj && isEditing && jsObj.parentObj.canManageContent){ // Plone does not allow select outside folder_contents
	//// not in ie... need branched methods SO write the whole TD at once - to-do mar 18 03

		
//		alert('should write out checkbox for this item: ' + this.MD.title)
		
		var cb = document.createElement("input");	

		cb.setAttribute ('type', 'checkbox');	////// ie5/mac falls over on this line for some reason
		

//		cb.setAttribute ('onchange', jsObj.path + '.selectMe(this)');
		cb.setAttribute ('onclick', jsObj.path + '.selectMe(this)');	
		
		cb.className = 'selItem';

		obj.insertBefore(cb, obj.childNodes[0]);
		jsObj.cb = cb;
		g_cbEls.push(cb)
	}

	g_expandableItems[g_expandableItems.length] = childObj;
	
}

function expandAll(){
	for (var i=0; i < g_expandableItems.length; i++){
		toggleOneItem(g_expandableItems[i], 'block');
	}
		
	g_toggleEditSafHackNexpanded = g_expandableItems.length; // safari workaround for toggle edit :O(
}

function collapseAll(){
	for (var i=0; i < g_expandableItems.length; i++){
		toggleOneItem(g_expandableItems[i], 'none');
	}
	g_toggleEditSafHackNexpanded = 0; // safari workaround for toggle edit :O(
}

function ieHackToggleEvt(id){
	
//	var event = window.Event;
	var el = document.getElementById(id)
//	alert(el)
	toggleItems(el)
}




var g_openOptions_object



var g_goOptions_offset_X = -10;
var g_goOptions_offset_Y = 0;

/*
if (navigator.userAgent.indexOf('Safari') >= 0) {
	g_goOptions_offset_Y = -12;
}
*/

function showOpenOptions(domObj){
	
	g_openOptions_object = domObj.parentNode.jsObj;
	
	var x = getAbsX(domObj.parentNode) + g_goOptions_offset_X
	var y = getAbsY(domObj.parentNode) + g_goOptions_offset_Y
	
/////	g_showingMenu = 'openOptions';
	
	var isFolder = g_openOptions_object.isFolder
	
	var selObj = document.getElementById( isFolder ? 'openOptions' : 'openOptionsObj')
	var hideObj = document.getElementById( isFolder ? 'openOptionsObj' : 'openOptions')
	
	selObj.selectedIndex = 0;
	
	if (document.all){
		selObj.style.pixelLeft = x;
		selObj.style.pixelTop = y;
	}else{
		selObj.style.left = x + 'px';
		selObj.style.top = y + 'px';
	}
	
	selObj.style.display = 'block';
	hideObj.style.display = 'none';
	

}




function hideOpenOptions(){

	setTimeout('hideOpenOptionsDelayed()', 400);
	
}

function hideOpenOptionsDelayed(){

	if ( g_insel ) return true;
	
	document.getElementById('openOptions').style.display='none';
	document.getElementById('openOptionsObj').style.display='none';

}


// get the true offset of anything on NS4, IE4/5 & NS6, even if it's in a table!

function getAbsX(elt) { return (elt.x) ? elt.x : getAbsPos(elt,"Left"); }
function getAbsY(elt) { return (elt.y) ? elt.y : getAbsPos(elt,"Top"); }
function getAbsPos(elt,which) {
 iPos = 0;
 while (elt != null) {
  iPos += elt["offset" + which];
  elt = elt.offsetParent;
 }
 return iPos;
} 

function openItemWithOption(selObj){


//alert(selObj.childNodes[2].childNodes[0])

	hideOpenOptions();
	
	var val = selObj.options[selObj.selectedIndex].value.split('|'), main = val[0], url;
	
	
	switch ( main ) {
		case 'scroll' :
			window.scrollTo(0,0);
			return;
		
		case 'bottom' :
		
//		alert(g_openOptions_object.parentObj)
			root.cn[root.cn.length - 1].scrollIntoView();
			return;
			
		case 'parent' :
			if(g_openOptions_object.parentObj && g_openOptions_object.parentObj.scrollIntoView){
				g_openOptions_object.parentObj.scrollIntoView()
			}else{
				window.scrollTo(0,0);
			}
			return;
			
		case 'cancel' :
			return;
		case 'sub' :
		//	window.open('http://www.theknownet.com/renderCGIs.cntnrs.subFolder.fcgi?' + g_openOptions_object.objID + ";" + escape(g_openOptions_object.path));

/*
			if (g_openOptions_object.canInspect == false){
				alert('Sorry, that folder can only be viewed by logged-in members of certain groups')
			}
*/			g_openOptions_object.fetchContents()
	//		g_openOptions_object.icon.src = g_portal_url+'/knotes_ui_imgs/small_olFolder_pending.gif';
	//		callToServer('http://www.theknownet.com/renderCGIs.cntnrs.subFolder.fcgi?'  + g_openOptions_object.objID + ";" + escape(g_openOptions_object.path));
		//	alert('Sorry not implemented.');
			return;
		case 'folder' :
			url = g_openOptions_object.url;
			break;
		case 'tab' :
			alert('Sorry not implemented.');
			return;
		case 'web' :
			url = 'http://www.theknownet.com/renderCGIs.sites.site.fcgi?oid=' + g_openOptions_object.objID;
			break;
		case 'info' :
			url = 'http://www.theknownet.com/oo_CGIs.showObjProps.fcgi?' + g_openOptions_object.objID;
			break;
	}
	
	switch ( val[1] ) {
	
		case 'replace' :
			document.location.href = url;
			break;
		case 'win' :
			window.open(url);
			break;
		case 'tab' :
			alert('Sorry not implemented.');
			break;
	}
	
}

function scrollIntoView(){

    scrollObjIntoView(this.domObj)

}

function scrollObjIntoView(domObj){

	if(document.getElementById){
		if(domObj.scrollIntoView){
			domObj.scrollIntoView(top);
		}
		else {
			var y = getAbsY(domObj)
			var divY = getAbsY(document.getElementById('folders'))
			window.scrollTo(0,y-divY);
		}
	}
}

function move(obj, x, y){
//if(obj.style.left) alert (obj.style.left)
	if (true){//obj.style.pixelLeft){
		obj.style.pixelLeft = obj.style.pixelLeft + x;
		obj.style.pixelTop = obj.style.pixelTop + y;	
	}else{
		var newX1 = parseInt(obj.style.left) + x;
		var newY1 = parseInt(obj.style.top) + y;

		obj.style.left=newX1+"px";
		obj.style.top=newY1+"px";
	}
}


///////// from apple sample code --- use iframes not xml data objects for server coms

var IFrameObj; // our IFrame object


function oo_handleHttpResponse(){


  if (http.readyState == 4) {
  
  
    // handle the response
    results = http.responseText;
    
    var i = 0, objMetadata = new Array();
    
    var x = results.split('<*>'), N = (x.length - 1);
    
    for (var i = 0; i < N; i++){
        objMetadata[i] = x[i].split('');
    }
        
    http_callingObject.loaded(objMetadata, 'OK')
  }

}

function callToServer(URL, obj) {

///// window.open(URL)


//alert('callToServer calls xmlrequestobj');

//alert('1 - url = ' + URL)
  http.open("GET", URL, true);
//alert(2)
  http.onreadystatechange = oo_handleHttpResponse;
//alert(3)
  http.send(null);
//alert(4)
  http_callingObject = obj;
//alert(5)

  return 0;
 


 //////////// old code follows
 

  if (!document.createElement) {return true};
  var IFrameDoc;
 					///// var URL = 'server.html';
  if (!IFrameObj && document.createElement) {
    // create the IFrame and assign a reference to the
    // object to our global variable IFrameObj.
    // this will only happen the first time 
    // callToServer() is called
   try {
      var tempIFrame=document.createElement('iframe');
      tempIFrame.setAttribute('id','RSIFrame');
      tempIFrame.style.border='0px';
      tempIFrame.style.width='0px';
      tempIFrame.style.height='0px';
      IFrameObj = document.body.appendChild(tempIFrame);
      
      if (document.frames) {
        // this is for IE5 Mac, because it will only
        // allow access to the document object
        // of the IFrame if we access it through
        // the document.frames array
        IFrameObj = document.frames['RSIFrame'];
      }
    } catch(exception) {
      // This is for IE5 PC, which does not allow dynamic creation
      // and manipulation of an iframe object. Instead, we'll fake
      // it up by creating our own objects.
      iframeHTML='<iframe id="RSIFrame" style="';
      iframeHTML+='border:0px;';
      iframeHTML+='width:0px;';
      iframeHTML+='height:0px;';
      iframeHTML+='"><\/iframe>';
      document.body.innerHTML+=iframeHTML;
      IFrameObj = new Object();
      IFrameObj.document = new Object();
      IFrameObj.document.location = new Object();
      IFrameObj.document.location.iframe = document.getElementById('RSIFrame');
      IFrameObj.document.location.replace = function(location) {
      ////////  this.iframe.src = location;
      }
    }
  }


	if (navigator.userAgent.indexOf('Safari') >= 0)	{	// problem with iframe replace method - does not replace after first hit - still in v74
		IFrameObj.src = URL; // unfortunate since this shows in safaris history
///////  IFrameObj.location.replace(URL); /// try this may 20 03 - maybe this will work? = nope! try altering methods based on adc webdev example
  		return true;
	}
 
  if (navigator.userAgent.indexOf('Gecko') !=-1 && !IFrameObj.contentDocument) {
    // we have to give NS6 a fraction of a second
    // to recognize the new IFrame
    setTimeout('callToServer("' + URL + '")',10);
    return false;
  }
  
  if (IFrameObj.contentDocument) {
    // For NS6
    IFrameDoc = IFrameObj.contentDocument; 
  } else if (IFrameObj.contentWindow) {
    // For IE5.5 and IE6
    IFrameDoc = IFrameObj.contentWindow.document;
  } else if (IFrameObj.document) {
    // For IE5
    IFrameDoc = IFrameObj.document;
  } else {
    return true;
  }
  

  IFrameDoc.location.replace(URL);
  return false;
} 


var gk_goStr = '<span onmouseover="showOpenOptions(this);return true" onmouseout="hideOpenOptions();return true">GO...</span>';

var optStr = '<form id="optionForm">\r<select id="openOptions"\r\t'
//optStr += 'onblur="hideOpenOptions();return true;"\r\t'
optStr += 'onmouseover="g_insel=1;return true" onmouseout="g_insel=0;hideOpenOptions();return true" '
optStr += 'onchange="openItemWithOption(this);return true;">\r<option value="cancel" style="color:#AAA;">Click here for options...'
optStr += '</option>\r<option value="cancel">Cancel</option>\r<optgroup id= "scrl" label= "Scroll"><option value="scroll">To top</option>\r'
optStr += '<option value="bottom">To bottom</option><option value="parent">To parent</option>'
optStr += '</optgroup>\r<optgroup id= "folder" label= "Open as folder">\r<option value="sub">As subfolder within this page<'
optStr += '/option>\r<option value="folder|replace">Replace current page</option>\r<option value="folder|tab" disabled>'
optStr += 'In a new TAB</option>\r<option value="folder|win">In a new window</option>\r</optgroup>\r<optgroup id= "web" '
optStr += 'label= "Open as web content">\r<option value="web|replace">Replace current page</option>\r<option value="web|tab"  disabled>'
optStr += 'In a new TAB</option>\r<option value="web|win">In a new window</option>\r</optgroup>\r<optgroup id= "web" label= '
optStr += '"Get full info for this item">\r<option value="info|replace">Replace current page</option>\r<option value="info|tab"  disabled>'
optStr += 'In a new TAB</option>\r<option value="info|win">In a new window</option>\r</optgroup>\r</select>\r';

optStr += '<select id="openOptionsObj"\r\t'
//optStr += 'onblur="hideOpenOptions();return true;"\r\t'
optStr += 'onmouseover="g_insel=1;return true" onmouseout="g_insel=0;hideOpenOptions();return true" '
optStr += 'onchange="openItemWithOption(this);return true;">\r<option value="cancel" style="color:#AAA;">Click here for options...'
optStr += '</option>\r<option value="cancel">Cancel</option>\r<optgroup id= "scrl" label= "Scroll"><option value="scroll">To top</option>\r'
optStr += '<option value="bottom">To bottom</option><option value="parent">To parent</option>'
optStr += '<optgroup id= "folder" label= "Open this item">\r<option value="folder|replace">Replace current page</option>\r<option value="folder|tab"  disabled>'
optStr += 'In a new TAB</option>\r<option value="folder|win">In a new window</option>\r</optgroup>\r<optgroup id= "web" label= '
optStr += '"Get full info for this item">\r<option value="info|replace">Replace current page</option>\r<option value="info|tab"  disabled>'
optStr += 'In a new TAB</option>\r<option value="info|win">In a new window</option>\r</optgroup>\r</select>\r</form>';




/****** ADVANCED FUNCTIONALITY *********/
/*
function addIfPresent(item, pre) {
	var s = '';
	if (item && item.length > 3){
		s = "<i><em>" + pre + "</em>" + item + "</i>\r"
	}
	return s;
}
*/

function addIfPresent(item, pre) {
	var s = '';
	if (item && item.length > 3){
		s = "<dt>" + pre + "</dt><dd>" + item + "</dd>\r"
	}
	return s;
}

var fficons=[['small_olFolder_closed.gif', 'MT_folder_closed.gif'], ['discussion_closed.gif', 'discussion_MT.gif'], ['discussion_attach_closed.gif', 'MT_attach_closed.gif']]

            icons = ['discussion_attach_closed.gif', 'MT_attach_closed.gif',]
function ffolderIcon() {    ////  NB - likely that this.folderIcon static property of main object is the one to change here!!!!!

    this.folderIconName = 0;
    if(this.thumbnail.indexOf('_closed.gif') > -1) {
        this.folderIconName = this.thumbnail.split('_closed.gif')[0]
        return this.thumbnail
    }

    if (this.sizeStr.indexOf('private') > -1){
        return 'private_ol_folder_closed.gif'
    }
    var i = this.isDiscussion ? (this.hasAttachments ? 2 : 1) : 0;
    
    return this.sizeStr.indexOf('0') == 0 ? fficons[i][1] : fficons[i][0];
    
}


function KN_DBprops(objMD){ // MD (temp for turning data to html) subobj of rowObj encapsulates loading/displaying/altering of properties

// NB - can have alternatives here for varying kinds of metadata

	this.rowRender = rowRender;
	this.detailRender = detailRender;
	
	this.ffolderIcon = ffolderIcon;

	this.objID = objMD[0];
	var uid = objMD[1];
	
	this.uid = uid;
	
	if ( uid.indexOf(blog_path) > -1) this.URL = blog_url + '/entries' + uid.split(blog_path)[1]
	else this.URL = uid
	
	this.thumbnail = objMD[2];
	this.medium = objMD[3];
	this.title = objMD[4];
	this.ownerStr = objMD[5];
	this.entryDateLong = objMD[6];
	this.lastModDateLong = objMD[7];
	this.sizeStr = objMD[8];
	this.description = objMD[9].split('\r\r').join('<p></p>');
	this.ownerID = objMD[10];
	this.permStr = objMD[11];
	
	///////// !!!!!!± ALLOWED TYPES IN NOW ACTUALLY IN THIS POSITION
	
	this.instructions = objMD[12].split('\r\r').join('<p></p>');
	this.secondaryType = objMD[13];	
	
	this.viewURL = this.URL;
	
	
	this.entryDate = this.entryDateLong.split(' ')[0]
	this.lastModDate = this.lastModDateLong.split(' ')[0]
	
	
	
//	this.editStr = this.ownerID + '|' + this.permStr
	this.editStr = this.permStr
	
//	this.offlineLocation = (objMD[27] && objMD[27] != '') ? objMD[27] : false;

// python script: perms=str(canView)+str(canEdit)+str(canDelete)+str(canAdd)+str(folderish)

	this.title = this.title.split('<BR>').join(' ');
	this.title = this.title.split('\r').join(' ');

    this.isDiscussion = this.medium.indexOf('Discussion') == 0; // NB SHOULD REPLACE WITH AN AD-HOC ATTRIBUTE SNIFF -s o can re-use kind column
    this.isBlog = (this.medium.indexOf('log Entry')> -1);
    
    this.hasAttachments =  (this.isDiscussion && (this.sizeStr.indexOf('resource') > -1))
    
var folderishFlag = this.permStr.charAt(4)

/*
//// HACKING THIS FOR NOW --- FOR entries from sql WE WILL GUESS CONSERVATIVELY INSTEAD OF TOUCHING OBJECTS ////

if (this.permStr.charAt(0) == '*'){
    folderishFlag = 1;
    this.permStr = '111111111111' /// even worse hack for the mockup only :o)  
}
/// above is the hack
*/
if (this.isBlog) this.isDiscussion = true;

if (this.isDiscussion && (this.URL.indexOf('/blog_forum') < 1)) this.URL = this.URL+'/blog_forum';


/////////   if (this.isBlog || this.isDiscussion ) this.isFolder = true; //// HACKING THIS FOR NOW

////   alert('this.isFolder = ' + this.isFolder)

	if ((folderishFlag == '1') || (folderishFlag == 1)) { // this.medium == "Plone Folder" || this.medium == "PanesFolder" || this.medium == "IndexFolder" || this.medium == "Panes Folder" || this.medium == "Index Folder" || this.medium == "Workgroup"){
		this.isFolder = true;
		this.isEmptyFolder = (this.sizeStr.indexOf('0') == 0);
		this.thumbnail = g_portal_url+'/' + this.ffolderIcon();    //    small_olFolder_closed.gif';
		
		this.URL = this.URL+'/fast_folders';
	}

	this.mediumLong = this.medium;
	this.whoTerse = this.ownerStr.split(',')[0];
	
	if (this.secondaryType != ''){
		this.mediumLong = this.secondaryType + ' (' + this.medium + ')';
	}
	
	this.tnStr = '';
/*	
	if (this.customThumbnail.length > 3){
		if (this.customThumbnail.toLowerCase().indexOf('http') < 0){
			//this.customThumbnail = 'Thumbnails/' + this.customThumbnail;
		}
		this.tnStr = '<img class="tn" src="' + this.customThumbnail + '">'
	}

	if (this.thumbnail.toLowerCase().indexOf('http') < 0){
		//this.thumbnail = 'Thumbnails/' + this.thumbnail;
	}
*/
	this.descrStr = this.description;
	
	this.descrStr = this.descrStr.split('').join('<p></p>');
	this.descrStr = this.descrStr.split('</p><p>').join('');
	
	
	this.Date_created = new Date (this.entryDate);
	
	this.createdAsDate = this.Date_created.getTime();
	
	if (this.sizeStr.indexOf(' item') > -1){	// pluralise the string
		var N = parseInt(this.sizeStr);
		this.sizeStr = N + (N == 1 ? " item " : " items ");	//	NB!!!!! LEGACY FORMAT FROM remDB !!!!!
	}
	
	this.basicMDstr = '';
	this.extraMDstr = '';
	
	
	this.basicMDstr += addIfPresent( this.mediumLong, 'Kind: ');
//	this.basicMDstr += addIfPresent( this.offLineLoc, 'Location ( offline ): ');
	this.basicMDstr += addIfPresent( this.entryDateLong, 'Submitted on: ');
	this.basicMDstr += addIfPresent( this.lastModDateLong, 'Modified on: ');
	
	if ((this.isDiscussion) &&(this.ownerStr && this.ownerStr.length > 3)){
	   this.basicMDstr += addIfPresent( '<b>' + this.ownerStr + '</b>', 'Author: ')
	   var dbid = this.viewURL.split(g_portal_url)[0]
	   this.basicMDstr += '<dt>Syndication:</dt><dd><a title="RSS newsfeed link for this discussion and its sub-threads'
	       + '"href="' + this.viewURL + '/getRSS?mode=1&id='+ dbid +'">( xml news feed )</a></dd>\r"';
	   /// <a class="RSSlink" title="RSS newsfeed link for this discussion and its sub-threads" href="' + this.viewURL + '/getRSS?mode=1&id='+ this.objID +'"
       /// tal:attributes="href python:here.absolute_url() +'/getRSS?mode=1&id='+here.getDBID()"> </a>
	}
	else this.basicMDstr += addIfPresent( this.ownerStr, 'Submitted by: ')

}

/*
0	ID
1	edit
2	TN
3	URL_target
4	title
5	kind
6	size
7	date
8	who
9	customTN
10	P-wrapped-description-etc
11	MD
12	extras
*/
var gk_rowTemplate = '<div id="|'
	+ '" class="item" kn:perms="|" kn:types="|"'
	+ '>\r<table class="itemheadTbl">\r<tr>\r<td class="iconcell"><img src="|'
	+ '" alt="Icon" border="0">\r</td>\r<td class="bar">\r<a class="title" href = "|'
	+ '" title="Click the title to open this item, replacing the current page">|'
	+ '</a></td>\r<td class="kind">|'
	+ '</td><td class="size">|'
	+ '</td><td class="when">|'
	+ '</td><td class="who">|'
	+ '</td>\r</tr>\r</tr>\r</table>\r<table class="itemDetail">\r<tr|>\r<td class="descr_cell">'
	+ '\r<div class="md_cell">\r<dl class="MD">|</dl>\r'
//	+ '<dl class="MDX">|</dl>\r'
	+ '</div>|</td>\r</tr>\r</table>\r</div>\r';

gk_rowTemplate = gk_rowTemplate.split('|');


var g_concat = new Array();


function ie5PushHack(el){
	this[this.length] = el;
}
var xxx = new Array()
if (xxx.push){}
else{

	Array.prototype.push = ie5PushHack;

}

function open_view(url){    // should query a pref: show in frame, window, pswin

    var openurl = url + '?' + g_nowrapArgStr
    if (top.viewInFrame){
        top.viewInFrame(openurl)
    }else{
         window.open(openurl, 'view_item_win','')
    }
}

function rowRender() {

    var viewLinkS = '<a href="'
        + this.viewURL
        + '" title="Click to view this content">' + this.medium + '</a>';
///    var urlTargetStr = this.isFolder ? this.URL : this.URL + '" target="_top' /// ?????? !!!!! old from when frameset???

	var md = this.MDarray, k=0;
	g_concat.push( gk_rowTemplate[k++] + this.objID + gk_rowTemplate[k++] );
	g_concat.push( this.permStr + gk_rowTemplate[k++] );
	g_concat.push( this.instructions + gk_rowTemplate[k++] );
	g_concat.push( this.thumbnail + gk_rowTemplate[k++] );
	g_concat.push( this.URL + gk_rowTemplate[k++] );
	g_concat.push( this.title + gk_rowTemplate[k++] );
	g_concat.push( viewLinkS + gk_rowTemplate[k++] );
//	g_concat.push( this.medium + gk_rowTemplate[k++] ); /// already out july 29 04
	g_concat.push( this.sizeStr + gk_rowTemplate[k++] );
	
	
	
	g_concat.push( this.entryDate + gk_rowTemplate[k++] );
//	g_concat.push( this.lastModDate + gk_rowTemplate[k++] );  /// oct 6 05 changed to created not modified
	g_concat.push( this.whoTerse + gk_rowTemplate[k++] );
//	g_concat.push( this.tnStr + gk_rowTemplate[k++] );

   	g_concat.push( (this.isDiscussion ? ' class="discussDetail"' : '') + gk_rowTemplate[k++] );
	g_concat.push( this.basicMDstr + gk_rowTemplate[k++] );
//	g_concat.push( this.extraMDstr + gk_rowTemplate[k++] );
	g_concat.push( this.descrStr + gk_rowTemplate[k++] );

}

var g_curLoadDiv


function loadedSubobj(data, err){

	var subs;
	try{
		this.cn = new Array();
		if (this.subsDiv){		
			subs = this.subsDiv;
//			this.subsDiv.innerHTML = '';
		}else{
			subs = document.createElement("div");
			subs.className = "subs";
			this.subsDiv = subs;
			this.domObj.appendChild(subs);
		}
		
		var N = data.length, i, oneTestObj, s = ''
		
		g_concat = new Array() // clear concatenator
		
		this.subsMD = new Array()
		for (i=0; i < N; i++){
			oneTestObj = new KN_DBprops(data[i])
			oneTestObj.rowRender()
			this.subsMD.push(oneTestObj)
		}
		
		s = g_concat.join('');
		g_concat = new Array();
		subs.innerHTML = s;
		curObj = this;
		g_curLoadDiv = subs
		window.setTimeout('addTogglersInObj(g_curLoadDiv, curObj)', 200);
		
	}catch(e){
		if (navigator.userAgent.indexOf('Safari') >= 0) alert('There was a problem loading that data : ' + e)
	
	}	
	
	
	if (err != 'OK') feedbackMessage(err)
	this.isOpen = true;
	this.icon.src = g_portal_url+'/' + this.folderIcon + '_open.gif';
	

}

function loadedRoot(data, err, contextStr){
	var subs;
//	try{
		this.cn = new Array();
		if (this.subsDiv){		
			subs = this.subsDiv;
            this.subsDiv.innerHTML = '';
		}else{
			subs = document.getElementById('subsForumTop');
            subs.innerHTML = '';
			this.subsDiv = subs;
		}
		
		var N = data.length, i, oneTestObj, s = ''
		
		g_concat = new Array() // clear concatenator
		
		this.subsMD = new Array()
		for (i=0; i < N; i++){
		    if (data[i].length > 13){
                oneTestObj = new KN_DBprops(data[i])
                oneTestObj.rowRender()
                this.subsMD.push(oneTestObj)
//////                alert(i)
			}
		}
		
		s = g_concat.join('');
		g_concat = new Array();
		subs.innerHTML = s;
		curObj = this;
		g_curLoadDiv = subs
		window.setTimeout('addTogglersInObj(g_curLoadDiv, root)', 200);
		
//	}catch(e){
//		if (navigator.userAgent.indexOf('Safari') >= 0) alert('There was a problem loading that data : ' + e)	
//	}	
	
	if (err != 'OK') feedbackMessage(err)
	this.isOpen = true;
	this.icon.src = g_portal_url+'/' + this.folderIcon + '_open.gif';
	

}


function feedbackMessage(s){    // later may want dhtml to display, not js alert
    alert(s)
}

function toggleOL(){
 
    if (this.MD.sizeStr.indexOf('private') > -1){
        var hasPloneCookie = document.cookie.indexOf('__ac') > -1
        alert('You do not have the required permissions to view the contents of this item.' + (hasPloneCookie ? '' : ' Try logging in first.'))
        return false;
    }

	if (this.subsDiv){

	
		var disp = 'block', img = g_portal_url+'/' + this.folderIcon + '_open.gif'
		if (this.isOpen){
			disp = 'none';
			img = g_portal_url+'/' + this.folderIcon + '_collapsed.gif';
			this.isCollapsed = 1;
		}
		this.subsDiv.style.display = disp;
		this.isOpen = ! this.isOpen;
		this.hasBeenOpened = true;
		this.icon.src = img;
	}else{
//		this.fetchURL = 'http://www.theknownet.com/renderCGIs.cntnrs.subFolder.fcgi?'  + this.objID + ";" + escape(this.path)

	
		this.fetchContents();
	}
}

function fetchContents(cgiSpecial){	

	this.icon.src = g_portal_url+'/' + this.folderIcon + '_pending.gif';

//////	var url = cgiSpecial ? cgiSpecial : this.viewURL + '/dataonly_folder_render_xml' // + "?path=" + escape(this.path)


	var url = cgiSpecial ? cgiSpecial : this.viewURL + '/dataonly_SQL_render_xml' // + "?path=" + escape(this.path)

    this.iconLink.setAttribute("title",g_titleStrings['folderToggler']);



url = url.split('/blog_forum').join(''); //// *******8 HACKING OUT THE HACKED IN TEMPLATE DURING TESTING


	callToServer(url, this);
	
}

function fetchNewsFeed(){   ////// NEEDS UPDATING FOR AJAX 

	this.icon.src = g_portal_url+'/' + this.folderIcon + '_pending.gif';

	var url = this.viewURL + '/dataonly_RSS_render?path=' + escape(this.path)

    this.iconLink.setAttribute("title",g_titleStrings['folderToggler']);
    

	callToServer(url, this);	
}

var g_imgCache = new Array();

function cacheImage(arg) {
	if (document.images) {
		rslt = new Image();
		rslt.src = arg;
		g_imgCache.push(rslt)
	}
}

/*
cacheImage(g_portal_url+'/knotes_ui_imgs/small_olFolder_collapsed.gif')
cacheImage(g_portal_url+'/knotes_ui_imgs/small_olFolder_pending.gif')
*/


function checkCB(){return 0} // stub

var bannerAs = '<a href="javascript:void(expandAll())" title="Click to expand all detail displays">'
	+ '<img src="'+g_portal_url+'/knotes_ui_imgs/expand_all.gif" alt="Expand all detail displays" width="43" height="22" border="0" align="middle">'
	+ '</a><a href="javascript:void(collapseAll())" title="Click to collapse all detail displays">'
	+ '<img src="'+g_portal_url+'/knotes_ui_imgs/collapse_all.gif" alt="Collapse all detail displays" width="37" height="20" border="0" align="middle"></a>'
var cb_A =  '<a id="inspectClipboard" style="display:none;" onClick="openInPSWin(\'Items currently on the clipboard\', \'inspectClipboard\', 1);return false" href="inspectClipboard" target="_blank" title="Click to inspect what is on your portal content clipboard"><img src="'+g_portal_url+'/knotes_ui_imgs/cb_inspect_3.gif" width="24" height="21" border="0" align="middle"></a>'


var loginA = '<a id="login" href="javascript:void(redirectLogin())" title="Click to log in for editing and discussing">Login</a>'
var editA = '<a id="startedit" href="#edit" onclick="toggleEditing(true);return false;" title="Click to begin editing in this window">Edit</a>'
	+ '<a id="stopedit" href="#" onclick="toggleEditing(false);return true;" title="Click to stop editing in this window">Stop Editing</a>';

///////// utilities from legacy login

function redirectLogin(){

	var cgiStr = 'http://www.theknownet.com/portals.redirectLogin.fcgi?js=';
	
	cgiStr += '%0D%20var%20redirect%20%3D%20true;&url=' + document.location.href +'#edit'; // http://www.theknownet.com/evaluateCGIs.frontEnd.fcgi?evalID=eval_00016'
	window.open(cgiStr, "redirLogin", "status,location,menubar,scrollbars");

}




/**** for forums viewing of the sidebars ****/



var entriesByDay = []

function writeCalendar(){

    if (entriesByDay.length > 0) return 0// do not write out the cached calendar if another precedes it in markup
    
    for (var i=0;i< 33;i++){entriesByDay[i] = 0;}
    for (var i=0;i < cal_entries.length;i++){
        entriesByDay[cal_entries[i].day] = cal_entries[i].count
    }
    var s = '<h3 class="sidetitle" id="sidetitle_Calendar">Entries in ' + cal_label + '</h3>\r'
    + '<div align="center" class="calendar side" id="side_Calendar">'
//    + '<h3 class="calendarhead">' + cal_label + '</h3>'
    + '<table border="0" cellspacing="4" cellpadding="0" summary="Monthly calendar with links to each day\'s posts">'
    + '<tr>'
    
    for (var i = 0; i< cal_days.length; i++){
        s += '<th>' + cal_days[i] + '</th>'
    }
    s += '</tr>'
    for (var i = 0; i< cal_weeks.length; i++){
        var week = cal_weeks[i]
        s += '<tr>'
        for (var j = 0; j< week.length; j++){
            var day = week[j]
            s += '<td>'
            if (day) {
                if (entriesByDay[day]){
                    s += '<a href="' + cal_urlpre + day + '" title="' + entriesByDay[day] 
                    + (entriesByDay[day] > 1 ? ' entries' : ' entry')
                    + ' for this day. Click to view'
                    + (entriesByDay[day] > 1 ? ' them.">' : ' it.">')
                    + day + '</a>'
                }else{
                    s += day
                }
            }
            s += '</td>'
        }
        s += '</tr>'
    }
    s += '</table></div>'
    

 //   document.write(s)
 
 return s // doing sidebars by ajax so js has to be called separately

}

/*** batching controls ***/

function batcherSubmitted(){

    var batches = document.getElementById('b_offset'), bi = batches.selectedIndex;
    var sorts = document.getElementById('b_sort_by'), si = sorts.selectedIndex;
    var searchargStr =  '?template=weblog_dataonly_template'
        searchargStr += '&offset=' + batches.options[bi].value
        searchargStr += '&sort_by=' + sorts.options[si].value
        getWeblogData(g_curBatchAction + searchargStr)
}

function batcherNext(e){
   getWeblogData(g_curBatchNext + '&template=weblog_dataonly_template')
   return false;
}


function batcherPrev(e){
   getWeblogData(g_curBatchPrev + '&template=weblog_dataonly_template')
   return false;
}

var g_curBatchAction = '', g_curBatchNext = '', g_curBatchPrev = ''

function makeBatchFormSmart(fromAJAX){
    var sub = document.getElementById('batchSubmit'), formel = document.getElementById('batcher');

    if (sub && formel) {
        sub.style.display = 'none';
        g_curBatchAction = formel.action
        formel.action = 'javascript:void(batcherSubmitted())'
        
        if (fromAJAX) {} // already text-processed the links
        else {
            var next_el = document.getElementById('batchnext');
            var prev_el = document.getElementById('batchprev');
            if (next_el) {
                g_curBatchNext = next_el.href
                next_el.onclick=batcherNext
            }
            if (prev_el) {
                g_curBatchPrev = prev_el.href
                prev_el.onclick=batcherPrev
            }
        }
        
        var batches = document.getElementById('b_offset'), bi = batches.selectedIndex;
        var sorts = document.getElementById('b_sort_by'), si = sorts.selectedIndex;
        window.curBatch = batches.options[bi]
        window.bi = bi;
        window.curSort = sorts.options[si]
        window.showedCurBatch = false;
        batches.options[batches.options.length] = new Option('------', '-')
        batches.options[batches.options.length] = new Option('More?', 'MORE')
        batches.options[batches.options.length] = new Option('Fewer?', 'FEWER')
    }
}

function batchChoice(id){
/// maybe hide submit button if both the select boxen are in original state?
    var sub = document.getElementById('batchSubmit')
    sub.style.display = 'inline';

    if (id == 'b_offset'){
        var selObj = document.getElementById('b_offset')
        var i = selObj.selectedIndex, val  = selObj.options[i].value;
        if (val == 'MORE'){
            alert('should increase number of records in batches')
            selObj.selectedIndex = window.bi;
            return false;
        }
        if (val == 'FEWER'){
            alert('should decrease number of records in batches')
            selObj.selectedIndex = window.bi;
            return false;
        }
        if (val == '-'){
            selObj.selectedIndex = window.bi;
            return false;
        }
        window.bi = i;
    }
    return true;
}


var Sidebars = [], sidebarsDiv = null, hideSidebarEl = null, sidebarsSelObj = null;

function makeSidesCollapsible (){

    hideSidebarEl = document.getElementById('hideSelSidebar')

// sidebar_chooser

//    getSidebarPrefs()
    var sidetitles = filterForClass('sidetitle', document.getElementsByTagName('*'))
    var N = sidetitles.length, i, oneID;
    for (i = 0; i < N; i++){
        makeOneSideThingCollapsible(sidetitles[i].id)
    }
}

function makeOneSideThingCollapsible(id){


    sidebarsSelObj = document.getElementById('sidebar_chooser')
    var oneTitleObj = document.getElementById(id)
    var oneID = id.split('sidetitle')
    if(oneID.length > 1){
        var title = oneTitleObj.innerHTML;
        var oneItemID = 'side'+ oneID[1]
        if (oneItemID != 'sideAltStyles' && oneItemID != 'side_aboutstyle' ){
            sidebarsSelObj.options[sidebarsSelObj.options.length] = new Option(title, oneItemID)
        }
    }
}

var curSidebar = null, curSidebarTitle = null, curSidebarName = 'none';

function chose_sidebar(selObj){
    var i = selObj.selectedIndex, val = selObj.options[i].value, titleID = val.split('side_').join('sidetitle_');


    if (val != "-1"){
        hideSidebarEl.style.display = "inline"
        var sb_el = document.getElementById(val)
        var title_el = document.getElementById(titleID)
        
        if (sb_el){
            if (curSidebar) curSidebar.style.display = "none"
            if (curSidebarTitle) curSidebarTitle.style.display = "none"
            sb_el.style.display = "block"
            sidebarsDiv.style.display = "block"
            curSidebar = sb_el
            curSidebarName = val;
            if (title_el) {
                title_el.style.display = "block"
                curSidebarTitle = title_el
            }
        }
        
if (userName == 'STufail'){

//    alert('sb_el = ' + sb_el)
//     alert(document.getElementById('contextNav').innerHTML)
//     alert(document.getElementById('contextNav').innerHTML.indexOf('id="nav"'))

}


    }
}

function hideSidebar(){
    if (curSidebar) curSidebar.style.display = "none"
    if (curSidebarTitle) curSidebarTitle.style.display = "none"
    sidebarsDiv.style.display = "none"
    hideSidebarEl.style.display = "none"
    sidebarsSelObj.selectedIndex = 0;
    curSidebar = null;
}

// AJAXian stuff for fetching sidebars - later will use for the rowsets

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

var http = getHTTPObject();
var http_callingObject = null;

//  alert(http)

//     alert(999)

function loadSideBars(){


//  alert('http.readyState = ' + http.readyState)



    if (http.readyState == 4) {
        // handle the response
        var sbs = http.responseText;
        
        sbs = sbs.split('<a ').join('<a onClick="return openURL(this.href) ? true : false;" ')
        sbs = sbs.split('<A ').join('<a onClick="return openURL(this.href) ? true : false;" ')
        
        sbs = extractContextualNav() + extractJSfromSidebarText(sbs) + sbs
             
        sbs = sbs.split(this_url).join(blog_url)
       
        sidebarsDiv.innerHTML = sbs
        window.setTimeout('makeSidesCollapsible()', 250)
    }
}

var g_pendingAjaxDisplayIsBlogBased = false;

function loadTopFolder(){

    if (http.readyState == 4) {
        // handle the response
        var data = http.responseText.split('<**DATA**>');
 //          alert('AJAX RETURNED ' + data.length)
        var context=data[0]
        if (data.length > 1){
            var md = data[1].split('<*>'), objMD = [], i, j, N = md.length, oneMD;
            
            
            for (i=0; i < N; i++){
                objMD[i] = md[i].split('');
            }

            document.getElementById('subsForumTop').style.display='block'
            if(document.getElementById('crumbs')) document.getElementById('crumbs').style.display='block'

            document.getElementById('iframeEditDiv').style.display='none'
            
            
            if (g_pendingAjaxDisplayIsBlogBased){
                if(document.getElementById('crumbs')) document.getElementById('crumbs').style.display="none";
            }
//////            document.getElementById('editor_tabs').style.display='none'
            var contextObj = document.getElementById('top_context')
            
            context = context.split('<a ').join('<a onClick="openBatchURL(this.href);return false;" ')
            if (contextObj) contextObj.innerHTML = context
            root.loaded(objMD, 'OK')
            
            makeBatchFormSmart()
            g_pendingAjaxDisplayIsBlogBased = false;
        }
    }
}

function openBatchURL(url){
        getWeblogData(url + searchargStr)
        return 0;
}

function openURL(url){

    hideSidebar()

    if (url.indexOf('.xml') > -1){
        alert('this is a newsfeed: ' + url)
        return 1;
    }

    if ( (url.indexOf('weblog.categories') > -1) || (url.indexOf('weblog.archives') > -1) || (url.indexOf('weblog.authors') > -1)){
        var searchargStr = url.indexOf('?') > -1 ? '&template=weblog_dataonly_template' : '?template=weblog_dataonly_template'
//        window.open(url + searchargStr)

        g_pendingAjaxDisplayIsBlogBased = true;
        getWeblogData(url + searchargStr)
        return 0;
    }
    
    if (url.indexOf(blog_url) > -1){
    
        if (url.indexOf('createObject?type_name=KNBlog') > -1){
            loadEditIFrame('new_blog_entry')
            return 0;
        }
        
        if ((curSidebarName == 'side_Discussion') || (curSidebarName == 'side_Recent')){
            document.location = url + '/blog_forum'
            return 0;
        }
    }
    return 1;
}

var cal_label,cal_days,cal_weeks,cal_entries,cal_urlpre // globals here

function extractJSfromSidebarText(sbs){

    var i1 = sbs.indexOf('var cal_label');
    var i2 = sbs.indexOf('writeCalendar()');
    var s1 = 'nope!';
    
    if (i1 > -1 && i2 > -1){
        s1 = sbs.substring(i1,i2).split('var ').join('')
        eval(s1)
        return writeCalendar()
    }

///    window.open(blog_url + '/sidebars_ajax')  
    return ''
}

function extractContextualNav () {
    var navObj = document.getElementById('contextNav')
    if (navObj) {
        var navStr = navObj.innerHTML
        if (navStr.indexOf('id="nav"') > -1){
            navStr = navStr.split('id="nav"').join('id="side_nav" class="side" ')
        }else if (navStr.indexOf('ID=nav') > -1){
            navStr = navStr.split('ID=nav"').join('id="side_nav" class="side" ')
        }else{
            navStr = '<div id="side_nav" class="side">' + navStr + '</div>'
        }
            
        return '<h3 class="sidetitle" id="sidetitle_nav">Main Navigation Options</h3>\r' + navStr

    }
    return ''
}

var morenav_select = '<form id="extranav"><select id="sidebar_chooser" name="sidebar_chooser" onChange="chose_sidebar(this);return true;">'
    + '<option value ="-1">More Navigation and Information...</op' + 'tion>'
    + '<option value ="-1">-----------------</opt' + 'ion>'
    + '</sel' + 'ect>'
    + '<input type="button" onClick="hideSidebar();return false;" style="display:none;" name="hideSelSidebar" id="hideSelSidebar" value="Hide" />'
    + '</fo' + 'rm>'

function getSidebars(URL) {

  sidebarsDiv = document.getElementById('links')

  http.open("GET", URL, true);
  http.onreadystatechange = loadSideBars;
  http.send(null);
}


function getWeblogData(URL) {

    if (URL.indexOf('/blog_forum') > -1) { /// TEMP HACK - DO NOT AJAXIFY BATCHING FOR 1-ENTRY; NEED BETTER TEMPLATING FIRST
        URL = URL.split('&template=weblog_dataonly_template')[0]
        URL = URL.split('?template=weblog_dataonly_template')[0]
        document.location=URL
        return 0;
    }


  http.open("GET", URL, true);
  http.onreadystatechange = loadTopFolder;
  http.send(null);
  
}

var curFieldSet = 'main_form'

function toggleFieldSets(fieldSetID){
    if (fieldSetID != curFieldSet) {
        g_iframeEditingDocObj.getElementById(curFieldSet).style.display= 'none'
        g_iframeEditingDocObj.getElementById(fieldSetID).style.display= 'block'
        var linkObj = document.getElementById('editlink_' + fieldSetID)
        var curHilite = document.getElementById('editlink_' + curFieldSet)
        if ( curHilite ) curHilite.className = 'formerHilite'
        if ( linkObj ) linkObj.className = 'currentFSlink'
        
        curFieldSet = fieldSetID
    }
}


function writeQuickReplyToggler() {
    document.write('<a id="toggleQuickReplyLink" href="javascript:void(toggleQuickReply())">Show Quick-Reply Form</a>')
}

var g_quickReply_showing = 0;

function toggleQuickReply(){

    linkEl = document.getElementById('toggleQuickReplyLink')
    var el = document.getElementById('quickReply')

    if (el){
        el.style.display = g_quickReply_showing ? 'none' : 'block';
        linkEl.innerHTML = (g_quickReply_showing ? 'Show' : 'Hide') + '  Quick-Reply Form';
        g_quickReply_showing = ! g_quickReply_showing;
    }
}




/// del.icio.us playtagger from http://del.icio.us/js/playtagger - here, in-line, in case del site goes down

if(typeof(Delicious) == 'undefined') Delicious = {}
Delicious.Mp3 = {
    playimg: null,
    player: null,
    go: function() {
        var all = document.getElementsByTagName('a')
        for (var i = 0, o; o = all[i]; i++) {
            if(o.href.match(/\.mp3$/i)) {
                var img = document.createElement('img')
                img.src = 'http://del.icio.us/static/img/mp3/play.gif'; img.title = 'listen'
                img.height = img.width = 12
                img.style.marginRight = '0.5em'
                img.style.cursor = 'pointer'
                img.onclick = Delicious.Mp3.makeToggle(img, o.href)
                o.parentNode.insertBefore(img, o)
    }}},
    toggle: function(img, url) {
        if (Delicious.Mp3.playimg == img) Delicious.Mp3.destroy()
        else {
            if (Delicious.Mp3.playimg) Delicious.Mp3.destroy()
            var a = img.nextSibling, c=''
            if (document.defaultView && document.defaultView.getComputedStyle) c = document.defaultView.getComputedStyle(a,null).getPropertyValue('color')
            else if (a.currentStyle) c = a.currentStyle['color']
            c = c.replace(/^rgb|[ ()]/g, '')
            var hex = c.match(/^#?([a-f0-9]{6})$/), hexSm = c.match(/^#?([a-f0-9]{3})$/), rgb = c.match(/^([0-9]+),([0-9]+),([0-9]+)$/)
            if (rgb) { var c16 = "0123456789abcdef", c=''; for(var i=1,d;d=rgb[i];i++) { var j=d%16; c=c+c16.charAt((d-j)/16)+c16.charAt(j) } }
            else if (hex) c = hex[1]
            else if (hexSm) c = hexSm[1].charAt(0) + hexSm[1].charAt(0) + hexSm[1].charAt(1) + hexSm[1].charAt(1) + hexSm[1].charAt(2) + hexSm[1].charAt(2)
            else c = "000000"
            img.src = 'http://del.icio.us/static/img/mp3/stop.gif'; Delicious.Mp3.playimg = img;
            Delicious.Mp3.player = document.createElement('span')
            Delicious.Mp3.player.innerHTML = '<object style="vertical-align:bottom;margin-right:0.2em" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' +
            'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"' +
            'width="100" height="14" id="player" align="middle">' +
            '<param name="wmode" value="transparent" />' +
            '<param name="allowScriptAccess" value="sameDomain" />' +
            '<param name="flashVars" value="theLink='+url+'&amp;fontColor='+c+'" />' +
            '<param name="movie" value="http://del.icio.us/static/swf/playtagger.swf" /><param name="quality" value="high" />' +
            '<embed style="vertical-align:bottom;margin-right:0.2em" src="http://del.icio.us/static/swf/playtagger.swf" flashVars="theLink='+url+'&amp;fontColor='+c+'"'+
            'quality="high" wmode="transparent" width="100" height="14" name="player"' +
            'align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"' +
            ' pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>'
            img.parentNode.insertBefore(Delicious.Mp3.player, img.nextSibling)
    }},
    destroy: function() {
        Delicious.Mp3.playimg.src = 'http://del.icio.us/static/img/mp3/play.gif'; Delicious.Mp3.playimg = null
        Delicious.Mp3.player.removeChild(Delicious.Mp3.player.firstChild); Delicious.Mp3.player.parentNode.removeChild(Delicious.Mp3.player); Delicious.Mp3.player = null
    },
    makeToggle: function(img, url) { return function(){ Delicious.Mp3.toggle(img, url) }}
}

Delicious.addLoadEvent = function(f) { var old = window.onload
    if (typeof old != 'function') window.onload = f
    else { window.onload = function() { old(); f() }}
}

Delicious.addLoadEvent(Delicious.Mp3.go)

/// end of del.icio.us playtagger



/***** utility stufff for login / anon from quick reply form *****/

var vemail = false;
var vmembername = true;

var whitespace = " \t\n\r";
function isEmpty(s) {
    return ((s == null) || (s.length == 0))
}
function isWhitespace (s) {
    var i;

    if (isEmpty(s)) return true;


    for (i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}


/*****************captcha validation **************************/

var captcha_http;

function handleValidateCaptcha() { 
  if (captcha_http.readyState == 4) {
    results = captcha_http.responseText;
    if (results == '1'){
        window.status="Posting comment...";
        document.forms['inpage_comment_form'].submit()
    }else{
        window.status="Captcha validation failed!";   
        cw=document.getElementById("captcha_word")
        cw.value="";
        o = document.getElementById("captcha_img")
        o.src= "getCaptchaIMG/"+Math.round(Math.random()*9999999999)+".gif";
        alert('Oops! You got the image text wrong. Please try again.')
        
        cw.focus();
    }
  }
}

function validateCaptcha() {
    captcha_http = getHTTPObject();
    window.status="Validating captcha...";
    var url = "validateCaptchaAjaxian?"
    var cw = document.getElementById("captcha_word")
    if(!cw) {
        window.status="Posting comment...";
        document.forms['inpage_comment_form'].submit()
        return false;
    }
    var word=cw.value    
    if (isWhitespace(word)) {
        alert('Please enter the text shown in the image')
        return false;
    }
    var params = "word="+word
    url = url+params;
    captcha_http.open("GET", url, true);
    captcha_http.onreadystatechange = handleValidateCaptcha;
    captcha_http.send(null);
}

function validateCommentFromFormObj(formEl) {

    var bodyObj = formEl.text
    var body = bodyObj.value
    var title = formEl.title.value
    var usequote = formEl.usequote.checked
    var breakLines = formEl.breaks.checked
    
    
    if (isWhitespace(title)){
        alert("You must enter a comment title");
        return false;
    }
    
    if (breakLines){
        body = body.replace('\r','\n')
        //body = '<p>' + body.split('\r').join('<' + '/p><p>') + '<' + '/p>'
        body = '<p>' + body.split('\n').join('<' + '/p><p>') + '<' + '/p>'
        body = body.split('<p><' + '/p>').join('')
        body = body.replace('/p>','/p>\n')


    }
    if (usequote){
        var txt = ''
        if (window.getSelection)
            txt = window.getSelection();
        else if (document.getSelection)
            txt = document.getSelection();
        else if (document.selection)
            txt = document.selection.createRange().text;
        if (! isWhitespace(txt)) {
            txt="<"+"blockquote"+">"+txt+"<"+"/blockquote"+">";
            body = txt+body;
        }

    }
    bodyObj.value = body;

    return true;
    
}

function validateComment() {
    var formEl = document.getElementById("inpage_comment_form")
    if(document.getElementById('anon_reply').style.display!='none'){
        var full_name = formEl.anon_full_name
        if (full_name){
            full_name = full_name.value
            if(isWhitespace(full_name)){
                alert("You must enter a name of some kind in the 'Name' field.  Please enter a name and try again.");
                return false;
            }
        }
    }
    var anon_style = document.getElementById("reply_form").style.display

    if(anon_style.toLowerCase()=="block"){
        var o = document.forms['inpage_comment_form']['join_optional'].value

        if (o == '0'){
            var join_name = document.getElementById("join_name").value
            if(isWhitespace(join_name)){
                alert("You must choose a username!");
                return false;
            }
        }
    }




    validateCommentFromFormObj(formEl);
    validateCaptcha();
    return false;
    
}

function handleLogIn() {
  var f = document.forms['inpage_comment_form']
  if (http2.readyState == 4) {
    results = http2.responseText;

    if (results == "1"){
        alert("Wrong username or password!\n\nPlease try again");
        f["comment_submit_button"].disabled=true;
    }else{
        f["comment_submit_button"].disabled=false;
        document.getElementById("login_form").style.display="None";
        var asel = document.getElementById("auth_select");
        if (asel) asel.style.display="None";
        var cpt = document.getElementById("captcha")
        if(cpt) cpt.style.display="None";
        window.status="Log-in successful";

    }
  }
}

function logIn() {
    window.status="Contacting server for log-in";
    var url = "knLogIn?"
    var username=document.getElementById("ac_name").value;
    var password=document.getElementById("ac_password").value;
    var params = "__ac_name="+username+"&__ac_password="+password;
    url = url+params;
    http2.open("GET", url, true);
    http2.onreadystatechange = handleLogIn;
    http2.send(null);
}

function handleValidateEmail() {
  var f = document.forms['inpage_comment_form']
  if (http2.readyState == 4) {
    results = http2.responseText;
    if(results != "1"){
        window.status="Validating email address failed!"
        alert("Invalid Email Address");
        f["comment_submit_button"].disabled=true;

    }else{
        window.status="Email address valid";
        vemail = true;
        if(vmembername)f["comment_submit_button"].disabled=false;
    }

  }
}

function validateEmail() {
    window.status="Validating email address...";
    var url = "validateEmail?"
    var email=document.getElementById("email_for_anon").value
    if (isWhitespace(email)) {
        return false;
    }
    var params = "email="+email
    url = url+params;
    http2.open("GET", url, true);
    http2.onreadystatechange = handleValidateEmail;
    http2.send(null);
}


function handleValidateMemberName() {
  window.status="Validating member name..."
  var f = document.forms['inpage_comment_form']
  if (http2.readyState == 4) {
    results = http2.responseText;
    if(results != "1"){
        window.status="Validating member name failed!"
        alert("Invalid user name!\nIt may already be taken.\nPlease try again");
        document.getElementById("comment_submit_button").setAttribute('disabled',true);
        vmembername = false;

    }else{
        window.status="Member name valid";
        vmembername = true;
        if (vemail) f["comment_submit_button"].disabled=false;
    }

  }
}

function validateMemberName() {
    var url = "validateUserName?"
    var join_name = document.getElementById("join_name").value
    var f = document.forms['inpage_comment_form'];
    if (isWhitespace(join_name) ){
        vmembername = true;
        if (vemail) f["comment_submit_button"].disabled=false;
        return true;
    }else{
        var params = "join_name="+join_name
        url = url+params;
        http2.open("GET", url, true);
        http2.onreadystatechange = handleValidateMemberName;
        http2.send(null);
    }
}

function showForm(form) {
    var f = document.forms['inpage_comment_form']
    document.getElementById(form).style.display="Block";
    if (form == "login_form"){
        document.getElementById("anon_reply").style.display="None";
        f['l_b'].disabled=true;
        f['a_b'].disabled=false;
        f['comment_submit_button'].disabled=true;
    }else{
        document.getElementById("login_form").style.display="None";
        f['a_b'].disabled=true;
        f['l_b'].disabled=false;
        f['comment_submit_button'].disabled=true;
        validateemail=true;
    }

}

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

/*****Quick login form********/
var ql_form_showing=false;
var ql_http = '';

function cancelLogin(){

    if (document.getElementById('quick_login_box')){
        document.getElementById('quick_login_box').style.display = 'none'
    }
    ql_form_showing=false;
}

function showQuickLoginForm(){

    if (ql_form_showing) return false;
    
    if (document.getElementById('quick_login_box')){
        var formObj = document.getElementById('quick_login_box')
        formObj.style.display = 'block'
        if (document.getElementById('login_anchor')){
            var anchorObj = document.getElementById('login_anchor');
            formObj.style.left = getAbsX(anchorObj) - 100 + 'px'
            formObj.style.top = getAbsY(anchorObj) + 20 + 'px'            
        }
        if (document.getElementById('ql_ac_name')){
            document.getElementById('ql_ac_name').focus()
        }
    }
    ql_form_showing=true;
    ql_http = getHTTPObject();
}




function handleQuickLogIn() {
  if (ql_http.readyState == 4) {
    results = ql_http.responseText;
    if (results == "1"){
        document.getElementById('ql_error').innerHTML='Wrong user name or password!'
        window.status="Log-in failed!";
    }else{
        var href = this_url
        href += (href.indexOf('?') > -1) ? '&' : '?'
        href += 'portal_status_message=welcome!+your+are+now+logged+in'
        document.location=href
//    document.location = this_url;
        window.status="Log-in succeeded";
    }
  }
}

function quickLogIn() {
    window.status="Contacting server for log-in";
    var url = "knLogIn?"
    var username=document.getElementById("ql_ac_name").value;
    var password=document.getElementById("ql_ac_password").value;
    var params = "__ac_name="+username+"&__ac_password="+password;
    url = url+params;

    ql_http.open("GET", url, true);
    ql_http.onreadystatechange = handleQuickLogIn;
    ql_http.send(null);
}

var gk_hideStatusMsgLinkStr = '<a href="javascript:void(hideStatusMsg())" '
    + 'title="Click to hide the message above">hide this message</a>'

var gk_hideQuickLoginLinkStr = ' <a id="quicklogin_close" href="javascript:void(cancelLogin())" title="close this form"><img src="'
    + portal_url + '/knotes_ui_imgs/close_icon.gif" style="float: right;"></a>'

function hideStatusMsg(){
    if(document.getElementById('status_message')) document.getElementById('status_message').style.display = 'none';
}

function scrollObjIntoView(domObj){

    if(document.getElementById){
        if(domObj.scrollIntoView){
            domObj.scrollIntoView(top);
        }
        else {
            var y = getAbsY(domObj)
            var divY = getAbsY(document.getElementById('folders'))
            window.scrollTo(0,y-divY);
        }
    }
}


// get the true offset of anything on NS4, IE4/5 & NS6, even if it's in a table!

function getAbsX(elt) { return (elt.x) ? elt.x : getAbsPos(elt,"Left"); }
function getAbsY(elt) { return (elt.y) ? elt.y : getAbsPos(elt,"Top"); }
function getAbsPos(elt,which) {
 iPos = 0;
 while (elt != null) {
  iPos += elt["offset" + which];
  elt = elt.offsetParent;
 }
 return iPos;
} 

var g_nReplies = 'not set yet'

function previewComment(){
    var formEl =  document.forms['inpage_comment_form']
    var body = formEl.text.value, title = formEl.title.value, lead = formEl.lead.value;
    
    var origBody = body; // so can undo prep for posting
    validateCommentFromFormObj(formEl); // this prepares the paras and quotes !!!! NB ought to fix the side-effect assuming posting
    
    body = formEl.text.value
    formEl.text.value = origBody
 
    var anchorDiv, nReplies;
    if(document.getElementById('reply_form_preview')) {
        anchorDiv = document.getElementById('reply_form_preview')
        if (g_nReplies == 'not set yet') g_nReplies = anchorDiv.innerHTML
    }else{
        alert('Sorry, there was a problem.')
        return 0;
    }
    var tmpl = '<h3><b>*N*</b> <a href="javascript:void(alert(\'this is just a preview '
    + 'of what your comment would look like.\'))">*TITLE*</a></h3><div class="leadin">'
    + '*LEAD*</div>*BODY*<div class="posted">Preview of your comment <a href="javascript:void(hidePreview())">hide preview</a></div>'
    
    var s = tmpl.split('*N*').join(g_nReplies)
     s = s.split('*TITLE*').join(title)
     s = s.split('*LEAD*').join(lead)
     s = s.split('*BODY*').join(body)
     
     anchorDiv.innerHTML = s;
     anchorDiv.style.display='block'
    
}

function hidePreview(){
    if(document.getElementById('reply_form_preview')) document.getElementById('reply_form_preview').style.display='none'
}


function oneEditLinksStr(canEditThis, id, title) { // stub overridden in edit scripts, called in addLinksToPosted
    return ''
}

function batchChoice(id){
/// maybe hide submit button if both the select boxen are in original state?
    var sub = document.getElementById('batchSubmit')
    sub.style.display = 'inline';

    if (id == 'b_offset'){
        var selObj = document.getElementById('b_offset')
        var i = selObj.selectedIndex, val  = selObj.options[i].value;
        if (val == 'MORE'){
            alert('should increase number of records in batches')
            selObj.selectedIndex = window.bi;
            return false;
        }
        if (val == 'FEWER'){
            alert('should decrease number of records in batches')
            selObj.selectedIndex = window.bi;
            return false;
        }
        if (val == '-'){
            selObj.selectedIndex = window.bi;
            return false;
        }
        window.bi = i;
    }
    return true;
}
/*** below is for exfile preview ***/

function PopupPreview(preview_url, size1, size2) {
    size1=size1+50;
    if (size1>850) {
        size1=850;
    }
    size2=size2+150;
    if (size2>650) {
        size2=650;
    };
    F = window.open(preview_url,"Popup","resizable=1,status=0,scrollbars=1,width=" + size1 +",height="+ size2 );
    F.focus();
}



function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/;";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}


var g_EditIFrameAction = 'x';
var g_iframeTemplates = new Array();

var iframeHTML_help = '<div id="editor_tabs">'
    + '<a href="javascript:dismissEditor()">Close (back to normal view)</a>'
    + ' <small>[When you are finished with the content below, click the Close button to return to your previous view]</small></div>'
    + '<iframe style="display: block;width:100%;height:2000px;" id="editor_pane"'
    + 'src="' + blog_url + '/*ZID*?template=weblog_nowrap_template">'

g_iframeTemplates['view_help'] = iframeHTML_help

var g_lastYScroll = 0;

function loadEditIFrame(action, id) {    

    if (g_iframeTemplates[action]){
        var iframeHTML = g_iframeTemplates[action]
        
        if (id){
            iframeHTML = iframeHTML.split('*ZID*').join(id)
            iframeHTML = iframeHTML.split('*URL*').join(id)
        }
        var d = document.getElementById('iframeEditDiv')
        
    //    '*ZID*'
        
        if (g_EditIFrameAction != action) d.innerHTML = iframeHTML; // check to see if it had been cancelled since last pageload
        
        if(isForumView){
            document.getElementById('subsForumTop').style.display='none'
            document.getElementById('iframeEditDiv').style.display='block'
            
            if ((action.indexOf('new_kndiscussion') < 0) && (document.getElementById('crumbs'))){
                document.getElementById('crumbs').style.display='none'
            }
            
            if (action.indexOf('new_kndiscussion') > -1){
                scrollObjIntoView(document.getElementById('iframeEditDiv'))
            }      
        }else{
            document.getElementById('content').style.display='none'
            document.getElementById('links').style.display='none'
            document.getElementById('iframeEditDiv').style.display='block'
            
            if (document.body.scrollTop) g_lastYScroll = document.body.scrollTop
            
            if (action.indexOf('new_blog_entry') == -1){
                window.scrollTo(0,0)
            }
        }
    }
}


function dismissEditor() {

    if(isForumView){
        document.getElementById('subsForumTop').style.display='block'
        if(document.getElementById('crumbs')) document.getElementById('crumbs').style.display='block'
    }else{
        document.getElementById('content').style.display='block'
        document.getElementById('links').style.display='block'
    }
    document.getElementById('iframeEditDiv').style.display='none'
        
    if (g_lastYScroll) window.scrollTo(0, g_lastYScroll)
    
    g_lastYScroll = 0;
    
}
function filterForType(aType, aNodeList, firstEl){
    var aType = new String(aType);
    aType=aType.toLowerCase();
    var filteredNodeList = new Array();
    if(!(aNodeList.length > 0)){return filteredNodeList}
    for(var i=0; i<aNodeList.length; i++){
        var nodeString = new String(aNodeList[i].nodeName);
        nodeString = nodeString.toLowerCase();
        if(nodeString == aType){
            filteredNodeList[filteredNodeList.length] = aNodeList[i];
//          filteredNodeList.push(aNodeList[i]);
        }
    }
    if (firstEl){
        if(filteredNodeList.length > 0) return filteredNodeList[0]
        else return null;
    }
    return filteredNodeList;
}

function filterForClass(aClass, aNodeList, firstEl){
    var aClass = new String(aClass);
    aClass=aClass.toLowerCase();
    var filteredNodeList = new Array();
    if(!(aNodeList.length > 0)){return filteredNodeList}
    for(var i=0; i<aNodeList.length; i++){
        var nodeString = new String(aNodeList[i].className);
        nodeString = nodeString.toLowerCase();
        if(nodeString == aClass){
            filteredNodeList[filteredNodeList.length] = aNodeList[i];
//          filteredNodeList.push(aNodeList[i]);
        }
    }
    if (firstEl){
        if(filteredNodeList.length > 0) return filteredNodeList[0]
        else return null;
    }
    return filteredNodeList;
}


