/**************************************************
trivantis-wndobj.js
This file contains objects for published html see js/wndobj_designtime.js for additional methods that
are added to the prototypes of these objects. Please keep in mind that we want to keep this as
small as possible.
**************************************************/
var ON_MOUSEENTER = 0;
var ON_MOUSEEXIT = 1;
var ON_MOUSECLICK = 2;
var ON_MOUSEDBLCLICK = 3;
var ON_KEY = 4;
var ON_SHOW = 5;
var ON_DONE = 6;
var ON_ANYKEY = 7;
var ON_HIDE = 8;
var ON_RMOUSECLICK = 9;
var ON_TIMER = 10;
var ON_SELECTCHANGE = 11;
var ON_GROUPRUN = 12;

var FLAG_MOUSEENTER=0x1;
var FLAG_MOUSEEXIT=0x2;
var FLAG_MOUSECLICK=0x4;
var FLAG_MOUSEDBLCLICK=0x8;
var FLAG_KEY=0x10;
var FLAG_SHOW=0x20;
var FLAG_DONE=0x40;
var FLAG_ANYKEY=0x80;
var FLAG_HIDE=0x100;
var FLAG_RMOUSECLICK=0x200;
var FLAG_TIMER=0x400;

//TODO: remove all of these defines when published
//TODO: the following are copies from titleData, find a better place for them.
var ACTION = 6;
var BUTTON = 5;
var FORMBASE = 11;
var FORM_RADIO = 1;
var FORM_ENTRY = 2;
var FORM_COMBO = 3;
var FORM_LISTBOX = 4;
var FORM_CHECKBOX = 5;
var RADIOGROUP = 11;
var OBJQUESTION = 13;

var TRUEFALSE = 1;
var MULTCHOICE = 2;
var SHORTANSWER = 3;
var ESSAY = 4;
var FILLBLANK = 5;
var MATCHING = 6;
var DRAGDROP = 7;
var INSTRUCTIONS = 8;
var HOTSPOT = 9;
var LIKERT = 10;
var ORDINAL = 11;
var LIKERTTABLE = 12;

var QUESTIMAGE_ABOVE  =0;
var QUESTIMAGE_BELOW  =1;
var QUESTIMAGE_LEFT   =2;
var QUESTIMAGE_RIGHT  =3;

var QUESTION_ALLOW_MULTIPLE=0x1;
var QUESTION_SHOW_FEEDBACK=0x2;
var QUESTION_GRADE_INDIVIDUALLY=0x4;
var QUESTION_PERSIST_ANSWER=0x8;
var QUESTION_SURVEY_QUESTION=0x10;
var QUESTION_LIKERT_3AGREE=0x20;
var QUESTION_LIKERT_4AGREE=0x40;
var QUESTION_LIKERT_5AGREE=0x80;
var QUESTION_LIKERT_3IMP=0x100;
var QUESTION_LIKERT_4IMP=0x200;
var QUESTION_LIKERT_5IMP=0x400;
var QUESTION_LIKERTBKGD_1BAR=0x800;
var QUESTION_LIKERTBKGD_2BAR=0x1000;
var QUESTION_LIKERTBKGD_NONE=0x2000;
var QUESTION_LIKERT_INCLUDENA=0x4000;
var QUESTION_IMMEDIATE_FEEDBACK=0x8000;
var QUESTION_MC_DROPDOWNLISTBOX=0x10000;
var QUESTION_LIKERT_CUSTOM=0x20000;
var QUESTION_LIKERT_HIDECHOICETXT=0x40000;


var RADIO_TEXTLEFT=0x01;
var RADIO_CHECKED=0x02;
var ENTRY_MULTILINE=0x04;
var ENTRY_PASSWORD=0x08;
var ENTRY_READONLY=0x10;
var LIST_MULTISELECT=0x20;

var AUDDISP_SPEAKER=0;
var AUDDISP_NONE=1;
var AUDDISP_IMAGE=3;
var LOOP=0x00080000;
var PB_DRAW_VERT=0x0001;
var PB_TYPE_TIMER=0x0008;
var PB_TYPE_CUSTOM=0x0010;
var PB_AUTO_START=0x0020;
var PB_DRAW_DRAIN=0x0080;
var TOC_COMBO=2;

var TRANS_INHERIT = -1;
var TRANS_NONE=0;
var TRANS_BOX_IN = 1;
var TRANS_BOX_OUT = 2;
var TRANS_CIRCLE_IN = 3;
var TRANS_CIRCLE_OUT = 4;
var TRANS_WIPE_UP = 5;
var TRANS_WIPE_DOWN = 6;
var TRANS_WIPE_RIGHT = 7;
var TRANS_WIPE_LEFT = 8;
var TRANS_BLINDS_VERTICAL = 9;
var TRANS_BLINDS_HORIZONTAL = 10;
var TRANS_CHECKER_ACROSS = 11;
var TRANS_CHECKER_DOWN = 12;
var TRANS_DISSOLVE = 13;
var TRANS_SPLITIN_VERTICAL = 14;
var TRANS_SPLITOUT_VERTICAL = 15;
var TRANS_SPLITIN_HORIZONTAL = 16;
var TRANS_SPLITOUT_HORIZONTAL = 17;
var TRANS_STRIPS_DOWNLEFT = 18;
var TRANS_STRIPS_UPLEFT = 19;
var TRANS_STRIPS_DOWNRIGHT = 20;
var TRANS_STRIPS_UPRIGHT = 21;
var TRANS_HORIZONTAL_BARS = 22;
var TRANS_VERTICAL_BARS = 23;
var TRANS_FLY_TOP = 24;
var TRANS_FLY_TOPRIGHT = 25;
var TRANS_FLY_RIGHT = 26;
var TRANS_FLY_BOTTOMRIGHT = 27;
var TRANS_FLY_BOTTOM = 28;
var TRANS_FLY_BOTTOMLEFT = 29;
var TRANS_FLY_LEFT = 30;
var TRANS_FLY_TOPLEFT = 31;
var TRANS_RANDOM_EFFECT = 32;
var TRANS_RANDOM_NOFLY_EFFECT = 33;
var MAX_TRANS_SPEED = 10;

var VISIBLE=0x00000020;

var TEXT_OUTLINE = 0x00000008;

/**************************************************
JSWNDOBJ
**************************************************/
function jsWndObj()
{
	var THIS = this;
	THIS.actFlags=0;
	THIS.bLButtonDown = 0;
	THIS.cwObj = n;
	THIS.rtRect = new jsRect(0,0,0,0);
	THIS.name = n;
	THIS.div = n;
	THIS.ptPending = new jsPoint(-1,-1);
	THIS.ptDown = new jsPoint(-0,0);
	THIS.dTL = n; THIS.dT = n; THIS.dTR = n;
	THIS.dLT = n; THIS.dL = n; THIS.dLB = n;
	THIS.dBL = n; THIS.dB = n; THIS.dBR = n;
	THIS.dRT = n; THIS.dR = n; THIS.dRB = n;
	THIS.dCon = n;
	THIS.idSize = n;
	THIS.rectSize = n;
	THIS.zindex = 0;
	THIS.bEnabled=1;
	THIS.currTrans=0;

	// addVars() allows extensions to add vars
	if (THIS.designTime)
	{
		jsWndObj.prototype.designTime.call(THIS);
		THIS.designTime();
	}
}

var p = jsWndObj.prototype;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName,data,bInsAnc)
{
    var THIS = this;
    var arData = data.a;
    THIS.div = document.getElementById(uniqueName);
    THIS.div.tObj = THIS;
    var id = String(THIS.div.id);
    while (id && id.length && isNaN(id))
      id = id.substring(1);
    if( id && id.length){
    	var anchor = document.createElement('A');
		anchor.name = String(id)+'anc';
		if( bInsAnc ) {
			THIS.div.insertBefore(anchor, THIS.div.firstChild);
		} else {
			var dCon = THIS.div.firstChild;
			THIS.div.removeChild(dCon);
			THIS.div.appendChild(anchor);
			anchor.appendChild(dCon);
		}
    }
    THIS.parPage = trivPage;
    THIS.actFlags = arData[0];
    THIS.dwFlags = arData[1];
    THIS.cwObj = new cwObjPub();
    THIS.cwObj.wnd = THIS;
    THIS.cwObj.transData = arData[2];
    THIS.rtRect.set(arData[3][0],arData[3][1],arData[3][2],arData[3][3]);
    if(THIS.cwObj.getTrans(t)||THIS.cwObj.getTrans(f)){
    	THIS.cwObj.rect = THIS.rtRect.copy();
        if(typeof arData[2][6] != 'undefined'){
			THIS.cwObj.rect.x = arData[2][6];
			THIS.cwObj.rect.y = arData[2][7];
        }
    }
    THIS.setTrans(t);
    if(THIS.currTrans){
        if(!jsTrans.isFIFO(THIS.currTrans))
            THIS.div.style.visibility='hidden';
    }
	THIS.bLiveWin =data.bLiveWin;
};

p.editMode = function() {
    return (this.designTime && titleData.mode==EDIT); // may not have titleData !
};

p.mouseDown = function(e)
{
    var THIS = this;
    if (THIS.editMode())
        THIS.mouseDownEdit(e);
    else
    {
        if(e.which==1||(e.which==n&&e.button==1)){
    		THIS.bLButtonDown = 1;
    		var cwObj = THIS.cwObj;
    		if(THIS.designTime && cwObj && cwObj.par && cwObj.par.type == OBJQUESTION){
    			var choice = cwObj.par.isLiveQuestObject(cwObj);
    			if( choice )
    				THIS.parPage.questObjMouseDown( THIS, e, choice);
    		} else if(!THIS.designTime){
    		    if (THIS.down)
    		    	return THIS.down();
    		}
    	}
    }
};

p.mouseMove = function(e){

    var THIS = this;
    if (THIS.editMode())
        THIS.mouseMoveEdit(e);
    else
    {
        var cwObj = THIS.cwObj;
    	if(THIS.designTime && cwObj && cwObj.par && cwObj.par.type == OBJQUESTION){
        	var choice = cwObj.par.isLiveQuestObject(cwObj);
        	if( choice )
        		THIS.parPage.questObjMouseMove( THIS, e, choice);
        }
    }
};

p.mouseUp = function(e)
{
    var THIS = this;
	if(THIS.parPage.rtData1 != -1){
		if(document.releaseEvents) document.releaseEvents(Event.MOUSEMOVE);
		if(document.releaseEvents) document.releaseEvents(Event.MOUSEUP);
		document.onmousemove = THIS.parPage.rtData1;
		document.onmouseup = THIS.parPage.rtData2;
		THIS.parPage.rtData1 = -1;
		THIS.parPage.rtData2 = -1;
	}
    if (THIS.editMode())
        THIS.mouseUpEdit(e);
    else
    {
		if(THIS.bLButtonDown && (THIS.actFlags&FLAG_MOUSECLICK)&&(THIS.objType!=BUTTON))
			THIS.issueActions(ON_MOUSECLICK);
		THIS.bLButtonDown = 0;
		var cwObj = THIS.cwObj;
		if(THIS.designTime && cwObj && cwObj.par && cwObj.par.type == OBJQUESTION){
			var choice = cwObj.par.isLiveQuestObject(cwObj);
			if( choice )
				THIS.parPage.questObjMouseUp( THIS, e, choice);
		}
    }
};

p.mouseEnter = function(){
    if(!(this.editMode()))
        if (this.actFlags&FLAG_MOUSEENTER)
	       this.issueActions(ON_MOUSEENTER);
};

p.mouseExit = function(){
	if(!(this.editMode()))
	   if (this.actFlags&FLAG_MOUSEEXIT)
	       this.issueActions(ON_MOUSEEXIT);
};

p.mouseDblClk = function(e){
	if(this.editMode())
	   this.mouseDblClkEdit(e);
	else
	   if(this.actFlags&FLAG_MOUSEDBLCLICK)
	       this.issueActions(ON_MOUSEDBLCLICK);
};

p.contextMenu = function(e){
    if(this.editMode())
        this.contextMenuEdit(e);
    else
	    if(this.actFlags&FLAG_RMOUSECLICK){
			this.issueActions(ON_RMOUSECLICK);
			return cancelEvent(e);
	    }
	if (this.designTime)
		return cancelEvent(e);
};

p.isPlaying = function(){
	return f;
};

p.play = function(){
};

p.actionPlay = p.play;

p.stop = function(){
};

p.actionStop = p.stop;

p.isVisible = function(){
	return (this.div  && this.div.style.visibility != 'hidden');
};

p.show = function(){
    var THIS = this;
	if(!(THIS.editMode())){
		var bVis = THIS.isVisible();
		if(!THIS.bShown){
			THIS.bShown = t;
			bVis = f;
		}
		if(bVis || THIS.isTransitioning(t)) return; // already transing in
		if(THIS.isTransitioning(f)) THIS.cancelTrans();
		if((!THIS.cwObj) || !THIS.cwObj.getTrans(t)) THIS.div.style.visibility = 'inherit';
		if(THIS.actFlags&FLAG_SHOW) THIS.issueActions(ON_SHOW);
	}else THIS.div.style.visibility = 'inherit';
};

p.actionShow = p.show;

p.hide = function(){
    var THIS = this;
	if(!(THIS.editMode())){
		if(THIS.isVisible()==f || THIS.isTransitioning(f)) return; // already transing out
		if(THIS.isTransitioning(t)) THIS.cancelTrans();
		if((!THIS.cwObj) || !THIS.cwObj.getTrans(f)) THIS.div.style.visibility = 'hidden';
		if(THIS.actFlags&FLAG_HIDE) THIS.issueActions(ON_HIDE);
	}else THIS.div.style.visibility = 'hidden';
};

p.actionHide = p.hide;

p.actionTogglePlay = p.togglePlay;
p.actionToggleShow = p.toggleShow;


p.issueActions = function(on)
{
    var THIS = this;
    var cwObj = THIS.cwObj;
	// Handle an ON_SHOW or ON_HIDE action as a transition in/out respectively.
	if((on == ON_SHOW&&cwObj.getTrans(t)) ||
		(on == ON_HIDE&&cwObj.getTrans(f))){

		if(THIS.timerIn) clearTimer(THIS.timerIn);
		if(THIS.timerOut) clearTimer(THIS.timerOut);

        if(!THIS.currTrans) THIS.setTrans(on == ON_SHOW);
		var lDelay = cwObj.getTransDelay(on == ON_SHOW);
		if(lDelay ) setTimeout(function(){THIS.doTrans(on == ON_SHOW);},lDelay);
		else THIS.doTrans(on == ON_SHOW);
		if(on == ON_SHOW) THIS.parPage.arTransInWnds.push(THIS);
		else THIS.parPage.arTransOutWnds.push(THIS);
		return;
	}
	THIS.issueActionsInternal(on);
};

p.issueActionsInternal = function(on){
    var THIS = this;
    var cwObj = THIS.cwObj;
    var parPg = THIS.parPage;
    var arDelayAct = parPg.arDelayAct;
	trivArExec(cwObj.arChld,
		function(chld,i)
		{
			if( chld.type == ACTION && chld.on == on)
			{
				if(!chld.delay){
					parPg.doAction(chld.actItem,chld.elseItem,chld);
				}else{
					var timer = setTimeout( function(){
												for(var j=0;j<arDelayAct.length;j++) {
													if(arDelayAct[j]==timer){
														arDelayAct.splice(j,1);
														break;
													}
												}
												parPg.doAction(chld.actItem,chld.elseItem,chld);
												}, chld.delay);
					arDelayAct.push(timer);
				}
		    }
		});
};

p.isTransitioning=function(bIn){
	var div = this.div;
	if(div && div.bTrans && div.bIn == bIn) return t;
	return f;
};

p.cancelTrans=function(){
    var THIS = this;
    var div = THIS.div;
	if(!jsTrans.isFIFO(THIS.currTrans)&&theApp.is.ie){
		div.filters.revealTrans.stop();
	}else{
		div.bTrans=f;
		if(jsTrans.isFIFO(THIS.currTrans)){
			div.style.left=div.fX + 'px';
			div.style.top=div.fY + 'px';
			if(!div.bIn) div.style.visibility = "hidden";
		}else div.style.clip="rect(0px "+THIS.cwObj.rect.width+" "+THIS.cwObj.rect.height+" 0px)";
	}
	THIS.transDone(THIS);
};

p.updatePosForTrans=function(bIn)
{
    var THIS = this;
    var cwObj = THIS.cwObj;
    var rtRect = THIS.rtRect;
    var currTrans = THIS.currTrans;
    var parPage = THIS.parPage;
    var fifoExtra=20;

    var rectObj = new jsRect(cwObj.getXPos(parPage.currPage),cwObj.getYPos(parPage.currPage),
                             cwObj.rect.width,cwObj.rect.height);
	if(THIS.bHasMoved){
		rectObj.x = rtRect.x;
		rectObj.y = rtRect.y;
	}

	if(THIS.bHasSized){
		rectObj.width = rtRect.width;
		rectObj.height = rtRect.height;
	}

    rtRect.setRect( rectObj );

	var ownerRect = new jsRect(0,0,parseInt(parPage.div.style.width),parseInt(parPage.div.style.height));

	// First check if we have a parent that handles transition
	if (THIS.designTime)
	{
		var parObj = cwObj.par;
		var transGroup = n;
		while(parObj)
		{
			var isGrp = titleData.isGroup(parObj);

			if (!isGrp) break; // only interested in groups.

			if( parObj.getTrans(bIn))
				transGroup = parObj;

			parObj = parObj.par;

		}

	 	if(transGroup)
	 	{
			// Get the bounding rect for the container
			var rectGroup = rectObj.copy();
			transGroup.getBoundingRect(rectGroup,parPage.currPage);

			if(bIn){
				if( currTrans == TRANS_FLY_TOPLEFT ||
					currTrans == TRANS_FLY_LEFT ||
					currTrans == TRANS_FLY_BOTTOMLEFT)
					ownerRect.x -= (rectGroup.right() - rectObj.right());

				if( currTrans == TRANS_FLY_TOPLEFT ||
					currTrans == TRANS_FLY_TOP ||
					currTrans == TRANS_FLY_TOPRIGHT	)
					ownerRect.y -= (rectGroup.bottom() - rectObj.bottom());

				if( currTrans == TRANS_FLY_TOPRIGHT ||
					currTrans == TRANS_FLY_RIGHT ||
					currTrans == TRANS_FLY_BOTTOMRIGHT	)
					ownerRect.width += (rectObj.x - rectGroup.x);

				if( currTrans == TRANS_FLY_BOTTOMLEFT ||
					currTrans == TRANS_FLY_BOTTOM ||
					currTrans == TRANS_FLY_BOTTOMRIGHT	)
					ownerRect.height += (rectObj.y - rectGroup.y);
			}else{
				if( currTrans == TRANS_FLY_TOPLEFT	||
					currTrans == TRANS_FLY_LEFT		||
					currTrans == TRANS_FLY_BOTTOMLEFT )
					ownerRect.x -= (rectGroup.right() - rectObj.right());

				if( currTrans == TRANS_FLY_TOPLEFT		||
					currTrans == TRANS_FLY_TOP			||
					currTrans == TRANS_FLY_TOPRIGHT )
					ownerRect.y -= (rectGroup.bottom() - rectObj.bottom());

				if( currTrans == TRANS_FLY_TOPRIGHT		||
					currTrans == TRANS_FLY_RIGHT		||
					currTrans == TRANS_FLY_BOTTOMRIGHT )
					ownerRect.width += (rectObj.x - rectGroup.x);

				if( currTrans == TRANS_FLY_BOTTOMLEFT	||
					currTrans == TRANS_FLY_BOTTOM		||
					currTrans == TRANS_FLY_BOTTOMRIGHT )
					ownerRect.height += (rectObj.y - rectGroup.y);
			}
	   	}
	}

	if(bIn){
	    if( currTrans == TRANS_FLY_TOPLEFT	||
			currTrans == TRANS_FLY_LEFT		||
			currTrans == TRANS_FLY_BOTTOMLEFT ){
			rtRect.x  = ownerRect.x - fifoExtra - rectObj.width;
	    }
	    else if( currTrans == TRANS_FLY_TOPRIGHT	||
			 	currTrans == TRANS_FLY_RIGHT	||
			 	currTrans == TRANS_FLY_BOTTOMRIGHT ){
			rtRect.x  = ownerRect.right() + fifoExtra + rectObj.width;
	    }

	    if( currTrans == TRANS_FLY_TOPRIGHT ||
			currTrans == TRANS_FLY_TOP ||
			currTrans == TRANS_FLY_TOPLEFT ){
			rtRect.y    = ownerRect.y - fifoExtra - rectObj.height;
	    }
	    else if( currTrans == TRANS_FLY_BOTTOMRIGHT ||
			 	currTrans == TRANS_FLY_BOTTOM ||
			 	currTrans == TRANS_FLY_BOTTOMLEFT ){
			rtRect.y    = ownerRect.bottom() + fifoExtra + rectObj.height;
	    }
        THIS.moveTo(rtRect.x, rtRect.y);
    }else{
    	THIS.rectTransOut = rectObj.copy();
        if( currTrans == TRANS_FLY_TOPLEFT	||
			currTrans == TRANS_FLY_LEFT		||
			currTrans == TRANS_FLY_BOTTOMLEFT )
        {
            THIS.rectTransOut.x  = ownerRect.x - fifoExtra - rectObj.width;
        }
        else if( currTrans == TRANS_FLY_TOPRIGHT	||
				 currTrans == TRANS_FLY_RIGHT	||
				 currTrans == TRANS_FLY_BOTTOMRIGHT )
        {
            THIS.rectTransOut.x  = ownerRect.right() + fifoExtra + rectObj.width;
         }

        if( currTrans == TRANS_FLY_TOPRIGHT	||
			currTrans == TRANS_FLY_TOP		||
			currTrans == TRANS_FLY_TOPLEFT )
        {
            THIS.rectTransOut.y    = ownerRect.y - fifoExtra - rectObj.height;
        }
		else if( currTrans == TRANS_FLY_BOTTOMRIGHT	||
				 currTrans == TRANS_FLY_BOTTOM		||
				 currTrans == TRANS_FLY_BOTTOMLEFT )
        {
            THIS.rectTransOut.y = ownerRect.bottom() + fifoExtra + rectObj.width;
        }
    }
};

p.doTrans = function(bIn,bForceFinal,fnOverRide){
    var THIS=this;
	var div = THIS.div;
    /*
     * THIS.issueActions might have setup a timer to call us (for a delayed start),
     * so we need to make sure our context is still valid. It may be that we need to
     * save a pointer to the timer and cancel it, but for bug 6280 it seems the following
     * check for the div will be enough to fix it.
     */
    if (!div) return;

    if(!jsTrans.isFIFO(THIS.currTrans)&&theApp.is.ie){
        div.style.filter = "revealTrans(duration=" + (11-THIS.cwObj.getTransSpeed()) + ",transition=" + (THIS.currTrans-1) + ")";
        div.onfilterchange = function() { if( fnOverRide ) fnOverRide(); else THIS.transDone(THIS); };
        div.filters.revealTrans.apply();
        div.style.visibility = bIn ? "inherit" : "hidden";
        div.filters.revealTrans.play();
    }else{
        if(jsTrans.isFIFO(THIS.currTrans)){
            if(bIn) doDivTrans(f,div,THIS.currTrans-1,(11-THIS.cwObj.getTransSpeed(bIn)),fnOverRide ? fnOverRide : THIS.transDone,THIS,THIS.cwObj.getXPos(),THIS.cwObj.getYPos());
            else doDivTrans(t,div,THIS.currTrans-1,(11-THIS.cwObj.getTransSpeed(bIn)),fnOverRide ? fnOverRide : THIS.transDone,THIS,THIS.rectTransOut.x,THIS.rectTransOut.y);
        }
        else doDivTrans(!bIn,div,THIS.currTrans-1,(11-THIS.cwObj.getTransSpeed(bIn)),fnOverRide ? fnOverRide : THIS.transDone,THIS);
    }
};

p.transDone = function(wnd){
	if(!wnd.div) return;   //we already switched pages

    wnd.currTrans = 0;

	wnd.rtRect.x = parseInt(wnd.div.style.left);
	wnd.rtRect.y = parseInt(wnd.div.style.top);

	var i=0;
	for(i=0; i<wnd.parPage.arTransInWnds.length; i++){
		if(wnd.parPage.arTransInWnds[i]==wnd){
			wnd.parPage.arTransInWnds.splice(i,1);
			if(wnd.actFlags&FLAG_SHOW) wnd.issueActionsInternal(ON_SHOW);
			return;
		}
	}
	for(i=0; i<wnd.parPage.arTransOutWnds.length; i++){
		if(wnd.parPage.arTransOutWnds[i]==wnd){
			wnd.parPage.arTransOutWnds.splice(i,1);
			if(wnd.actFlags&FLAG_HIDE) wnd.issueActionsInternal(ON_HIDE);
			break;
		}
	}

	if(!wnd.parPage.arTransOutWnds.length&&wnd.parPage.fDelayedSwitch){
		wnd.parPage.switchPage(wnd.parPage.nextPage);
	}
};

p.setTrans = function(bIn){
    var THIS = this;
	THIS.currTrans=THIS.cwObj.getTrans(bIn);
	if(THIS.currTrans){
		if(THIS.currTrans==33) THIS.currTrans = randMinMax(1,23);
		else if(THIS.currTrans==32){
			if( THIS.cwObj.bLiveWin ) THIS.currTrans = randMinMax(24,31);
			else THIS.currTrans = randMinMax(1,31);
		}
		THIS.updatePosForTrans(bIn);
	}
};

p.toggleVisibility = function(){
	if (this.div.style.visibility=='hidden')
	   this.show();
	else
	   this.hide();
};

p.enable = function(bEn){
	this.bEnabled=bEn;
};

p.getRect=function(){
	return (this.rtRect.copy());
};

p.moveTo = function(x,y){
	this.rtRect.x = x;
	this.rtRect.y = y;
	this.div.style.left = x + 'px';
	this.div.style.top = y + 'px';
};

p.sizeTo = function(w,h){
    var THIS = this;
	THIS.rtRect.width = w;
	THIS.rtRect.height = h;
	THIS.div.style.width = w + 'px';
	THIS.div.style.height = h + 'px';
	if(THIS.dCon){
		THIS.dCon.style.width = w + 'px';
		THIS.dCon.style.height = h + 'px';
	}
};

p.flsLoading = function(player)
{
	if ( !player || typeof player.PercentLoaded == 'undefined' ) // in IE typeof can return 'unknown' when valid
		return t;

	return (player.PercentLoaded() != 100);
};

/**************************************************
JSWNDIMAGE
**************************************************/
function jsWndImage(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndImage.prototype = new jsWndObj();
p.constructor = jsWndImage;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    THIS.dCon = THIS.div.getElementsByTagName('IMG')[0];
};

p.changeContents = function(res){
    if (this.dCon) this.dCon.src = this.designTime ? res.getLink() : res;
};

/**************************************************
JSWNDBUTTON
**************************************************/
function jsWndButton(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndButton.prototype = new jsWndObj();
p.constructor = jsWndButton;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    THIS.dCon = THIS.div.getElementsByTagName('IMG')[0];
	THIS.src       =data.res;
	THIS.clickSrc  =data.resClick;
	THIS.overSrc   =data.resOver;
	THIS.div.style.cursor="pointer";
};

p.mouseDown = function(e){
	if(!this.editMode()) this.dCon.src=this.clickSrc;
	return jsWndObj.prototype.mouseDown.call(this,e);
};

p.mouseUp = function(e){
    var THIS = this;
	if(!(THIS.editMode())){
		THIS.dCon.src=THIS.overSrc;
		if(THIS.bLButtonDown)
		  THIS.parPage.doAction(THIS.cwObj.actItem,n,THIS.cwObj);
	}
	return jsWndObj.prototype.mouseUp.call(THIS,e);
};

p.mouseMove = function(e){
	if(this.editMode())
	   return jsWndObj.prototype.mouseMove.call(this,e);
};

p.mouseEnter = function(){
	if(!(this.editMode()))
	{
	   this.dCon.src = this.bLButtonDown ? this.clickSrc : this.overSrc;
	   return jsWndObj.prototype.mouseEnter.call(this);
	}
};

p.mouseExit = function(){
	if((!this.editMode()) && this.dCon)
	{
		this.dCon.src=this.src;
		return jsWndObj.prototype.mouseExit.call(this);
	}
};

/**************************************************
JSWNDANIMIMAGE
**************************************************/
function jsWndAnimImage(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndAnimImage.prototype = new jsWndObj();
p.constructor = jsWndAnimImage;

p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data, 1);
	THIS.bIsFlash = data.isFlash;
	THIS.getFlashObj();
	THIS.dCon = THIS.div.firstChild;
};

p.getFlashObj = function(){

	var THIS = this;
	if (!THIS.bIsFlash)
		return f;
	if (!THIS.flshObj)
	{
		try {
			if(theApp.is.ie||(navigator.appVersion.indexOf("Mac")!=-1))
				THIS.flshObj = THIS.div.getElementsByTagName('OBJECT')[0];
			else
				THIS.flshObj = THIS.div.getElementsByTagName('embed')[0];
		}
		catch(e){}
	}

	return THIS.flshObj;
};

p.fReadyChk = function(func,_retryNum)
{
	_retryNum=_retryNum?_retryNum:0;
	if (_retryNum>4) return f;

	var THIS = this;
	var flshObj=THIS.getFlashObj();

	var ret = t;
	if ( (!flshObj) || typeof(flshObj.PercentLoaded) == 'undefined' || flshObj.PercentLoaded() != 100) // in IE typeof can return 'unknown' when valid
	{
		setTimeout(function(){func.call(THIS,++_retryNum);},100);
		ret=f;
	}
	return ret;
};

/*
 * In the following functions you do not need to pass _retryNum
 * it is a parameter used by the system to keep track of how many
 * times the command has been re-attempted.
 */
p.play = function(_retryNum)
{
	if (this.fReadyChk(this.play,_retryNum))
		this.flshObj.Play();
};

p.stop = function(_retryNum)
{
	if (this.fReadyChk(this.stop,_retryNum))
	{
		this.flshObj.GotoFrame(0);
		this.flshObj.StopPlay();
	}
};

p.pause = function(_retryNum)
{
	if (this.fReadyChk(this.pause,_retryNum))
		this.flshObj.StopPlay();
};

p.gotoNextFrame = function(_retryNum)
{
	if (this.fReadyChk(this.gotoNextFrame,_retryNum))
	{
		var frame = this.flshObj.CurrentFrame()+1;
		this.flshObj.GotoFrame(frame);
	}
};

p.gotoPrevFrame = function(_retryNum)
{
	if (this.fReadyChk(this.gotoPrevFrame,_retryNum))
	{
		var frame = this.flshObj.CurrentFrame()-1;
		this.flshObj.GotoFrame(frame);
	}
};

p.gotoLabel = function(val){
	var flshObj=this.getFlashObj();
	if(flshObj) flshObj.TGotoLabel('/', val);
};

p.setVariable = function(name,val){
	var flshObj=this.getFlashObj();
	if(flshObj) flshObj.SetVariable(name,val);
};

p.getVariable = function(name){
	var flshObj=this.getFlashObj();
	if(flshObj) return flshObj.GetVariable(name);
	return 0;
};

p.isPlaying = function(){
	var flshObj=this.getFlashObj();
	if(flshObj) return flshObj.IsPlaying();
	return t;
};

p.gotoFrame = function(val){
	var flshObj=this.getFlashObj();
	if(flshObj) flshObj.GotoFrame(val);
};

p.callFunction = function(funcName, param, _retryNum){
	var resp = n;
	var THIS = this;

	if (!_retryNum) _retryNum=0;
	else if (_retryNum>4) return;

	var flshObj=this.getFlashObj();
	if(flshObj && typeof flshObj[funcName] != "undefined" )
			resp = flshObj[funcName](param);
	else
		setTimeout(function(){THIS.callFunction(funcName,param,++_retryNum);},250);
	return resp;
};

/**************************************************
JSWNDAUDIO
**************************************************/
function jsWndAudio(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndAudio.prototype = new jsWndObj();
p.constructor = jsWndAudio;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data, 1);
    var cwObj = THIS.cwObj;
	THIS.name = uniqueName;
    cwObj.iDisplay = data.iDisplay;
    //if (data.iDisplay!=AUDDISP_NONE && THIS.div) THIS.dCon = THIS.div.getElementsByTagName('DIV')[0];
    THIS.snd = new jsSound();
    THIS.snd.div = document.getElementById("snd"+uniqueName);
    THIS.snd.audio=THIS;
    cwObj.isFlashAudio = function(){return data.isFlash;};
    cwObj.hasEvents = function(){return data.hasEvents;};
    cwObj.supportsEvents = function(){return data.supportsEvents;};
    cwObj.linkName = data.linkName;
};

p.mouseDown = function(e){
    var THIS = this;
	if(!THIS.editMode() && (THIS.cwObj.iDisplay==AUDDISP_SPEAKER || THIS.cwObj.iDisplay==AUDDISP_IMAGE)){
        if(e.which==1||(e.which==n&&e.button==1))
			THIS.togglePlay();
	}
    return jsWndObj.prototype.mouseDown.call(THIS,e);
};

p.play = function(){
	if ((!this.editMode()) && this.snd) this.snd.play();
};

p.togglePlay = function(){
	if ((!this.editMode()) && this.snd) this.snd.togglePlay();
};

p.pause = function(){
	if ((!this.editMode()) && this.snd) this.snd.pause();
};

p.stop = function(){
	if ((!this.editMode()) && this.snd) this.snd.stop();
};

p.isPlaying = function(){
	if ((!this.editMode()) && this.snd) return this.snd.isPlaying();
	return f;
};

p.isResType = function(arTypes)
{
	var cwObj = this.cwObj;
	var resName = (this.cwObj.res&&cwObj.res.linkName)?cwObj.res.linkName:(cwObj.linkName?cwObj.linkName:"");
	if( !resName||!resName.length||!arTypes||!arTypes.length ) return 0;
	var testStr = "";
	for(var i=0; i<arTypes.length; i++) {
		if(testStr.length) testStr += "|";
		testStr += ("\\." + arTypes[i]);
	}
	if( !testStr.length) return 0;

	testStr = ".*(" + testStr + ")$";
	var rE = RegExp( testStr, "i");
	return rE.test(resName);
};


/**************************************************
JSSOUND
**************************************************/
function jsSound(){
    var THIS = this;
	THIS.audio = n;
	THIS.bPlaying = 0;
	THIS.winMgrId = n; // for callback on flash events
	THIS.flsPlayer = n;
	THIS.wmPlayer = n;
	THIS.wmEventHandlerScripts = []; // for callback on windows media events
}
p = jsSound.prototype = new jsWndObj();
p.constructor = jsSound;

p.onEvent = function(pname) {
	// alert('onEvent: ' + 'name=[' + pname + ']');
	var cwObj = this.audio.cwObj;
	var myWndPage = this.designTime ? wndPage : trivPage ;
	if ( ! cwObj.hasEvents() )
		return;

	trivArExec(cwObj.arEvents,
		function(o,i)
		{
			if ( o.name == pname )
				myWndPage.doAction(o.actItem);
		});
};

p.onDone = function() {
	var myWndPage = this.designTime ? wndPage : trivPage ;
	trivArExec(this.audio.cwObj.arChld,
		function(o,i)
		{
			if ( o.type == ACTION && o.on == ON_DONE )
				myWndPage.doAction(o.actItem, o.elseItem);
		});
};

p.play = function() {
    var THIS = this;
	if(THIS.audio.cwObj.isFlashAudio()) {
		THIS.setFlashPlayer();
		if (THIS.flsLoading(THIS.flsPlayer))
		{
			theApp.SetTimeout(THIS.play,100,THIS);
			return;
		}
		THIS.flsPlayer.sendEvent('play');
	} else if ( THIS.audio.cwObj.supportsEvents() && theApp.is.ie ) {
		THIS.setWmPlayer();
		if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.play();
	} else {
		var player = THIS.div.getElementsByTagName('embed');

		if ( player )
		{
			player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

			if ( typeof player.pause !== 'undefined' && (!this.isOldWM(player)||player.playState!==3) ) // WM
			{
				player.play();
			}
			else if ( typeof player.Step !== 'undefined' ) // QuickTime
			{
				var ps = player.GetPluginStatus();
				if ( !ps ) return;
				if ( ps.IContains('waiting') || ps.IContains('playable') )
				{
					setTimeout(function(){THIS.play();},100);
					return;
				}

				if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
				player.Play();
			}
			else if ( typeof player.DoPause !== 'undefined' ) // Real
			{
				player.DoPlayPause();
			}
			else
			{
			    THIS.resetEmbed((THIS.audio.cwObj.dwFlags & LOOP > 0), t);
			}
		}
	}
	THIS.bPlaying=1;
};

p.togglePlay = function(){
    var THIS = this;
	if(THIS.audio.cwObj.isFlashAudio()){
		THIS.setFlashPlayer();
		if (THIS.flsLoading(THIS.flsPlayer))
		{
			theApp.SetTimeout(THIS.togglePlay,100,THIS);
			return;
		}
		THIS.flsPlayer.sendEvent('playpause');
	} else if ( THIS.audio.cwObj.supportsEvents() && theApp.is.ie ) {
		THIS.setWmPlayer();
		if ( THIS.wmPlayer && THIS.wmPlayer.controls ) {
			THIS.setPlayState(THIS.wmPlayer);
			if ( THIS.bPlaying )
				THIS.wmPlayer.controls.pause();
			else
				THIS.wmPlayer.controls.play();
		}
	} else {

		var player = THIS.div.getElementsByTagName('embed');

		if ( player )
		{
			player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );
			THIS.setPlayState(player); // play state doesn't seem to be correct on IE for WM

			if ( typeof player.pause !== 'undefined' ) // WM
			{
				if ( THIS.bPlaying ) player.pause();
				else player.play();
			}
			else if ( typeof player.Step !== 'undefined' ) // QuickTime
			{
				var ps = player.GetPluginStatus();
				if ( !ps ) return;
				if ( ps.IContains('waiting') || ps.IContains('playable') )
				{
					setTimeout(function(){THIS.togglePlay();},100);
					return;
				}
				if ( ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
				if ( THIS.bPlaying ) player.Stop(); // or Step(0)
				else player.Play();
			}
			else if ( typeof player.DoPause !== 'undefined' ) // Real
			{
				player.DoPlayPause();
			}
		}
	}

	THIS.bPlaying=(THIS.bPlaying == 1 ? 0 : 1);
};

p.pause = function(){
    var THIS = this;
	if(THIS.audio.cwObj.isFlashAudio()){
		THIS.setFlashPlayer();
		if (THIS.flsLoading(THIS.flsPlayer))
		{
			theApp.SetTimeout(THIS.pause,100,THIS);
			return;
		}
		THIS.flsPlayer.sendEvent('pause');
	} else if ( THIS.audio.cwObj.supportsEvents() && theApp.is.ie ) {
		THIS.setWmPlayer();
		if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.pause();
	} else {
		var player = THIS.div.getElementsByTagName('embed');

		if ( player )
		{
			player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

			if ( typeof player.pause !== 'undefined' ) // WM
			{
				player.pause();
			}
			else if ( typeof player.Step !== 'undefined' ) // QuickTime
			{
				var ps = player.GetPluginStatus();
				if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
				player.Stop();
			}
			else if ( typeof player.DoPause !== 'undefined' ) // Real
			{
				player.DoPause();
			}
		}
	}
	THIS.bPlaying=0;
};

p.stop = function(){
    var THIS = this;
	if(THIS.audio.cwObj.isFlashAudio()){
		THIS.setFlashPlayer();
		if (THIS.flsLoading(THIS.flsPlayer))
		{
			theApp.SetTimeout(THIS.stop,100,THIS);
			return;
		}
		THIS.flsPlayer.sendEvent('stop');
	} else if ( THIS.audio.cwObj.supportsEvents() && theApp.is.ie ) {
		THIS.setWmPlayer();
		if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.stop();
	} else {
		var player = THIS.div.getElementsByTagName('embed');

		if ( player )
		{
			player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

			if ( typeof player.pause !== 'undefined' ) // WM
			{
				player.stop();
			}
			else if ( typeof player.Step !== 'undefined' ) // QuickTime
			{
				var ps = (typeof player.GetPluginStatus !== 'undefined' ? player.GetPluginStatus() : "complete"); // GetPluginStatus not available in QT with Flip4Mac playing WM media
				if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
				player.Stop();
				if ( typeof player.Rewind !== 'undefined' ) player.Rewind(); // Rewind not available in QT with Flip4Mac playing WM media
			}
			else if ( typeof player.DoPause !== 'undefined' ) // Real
			{
				player.DoStop();
			}
			else
			{
			    THIS.resetEmbed(f, f);
			}
		}
	}
	THIS.bPlaying=0;
};

p.setPlayState = function(player) {
	if ( ! player )
	{
		player = this.div.getElementsByTagName('embed');
		if ( player ) player = player[0];
	}

	this.bPlaying = jsWndVideo.getPlayState(player, this.isOldWM(player));

	return this.bPlaying;
};

p.resetEmbed = function(loop,auto)
{   // so published webtora doesn't need to know all the other embed attrs. b4 the entire embed tag was reconstructed.
    var tdiv = this.div;
	var emb = null;
	for (var i=0; !emb && tdiv.childNodes && i<tdiv.childNodes.length; i++)
		if( tdiv.childNodes[i] && tdiv.childNodes[i].setAttribute )
			emb = tdiv.childNodes[i];
	if ( emb) {
		emb.setAttribute("loop",loop);
		emb.setAttribute("autostart",auto);
	    tdiv.innerHTML = tdiv.innerHTML;
	}
};

p.setFlashPlayer = function() {
	if ( this.flsPlayer )
		return;

	if ( theApp.is.ie ) {
		var cwObj = this.audio.cwObj;
		var audDesignator = ( cwObj.iDisplay == AUDDISP_SPEAKER || cwObj.iDisplay == AUDDISP_IMAGE ? 'Audio' : '' );
		this.flsPlayer = document['swf' + this.audio.name + audDesignator];
	} else {
		var objects = this.div.getElementsByTagName('object');

		if ( objects && objects.length > 0 )
			this.flsPlayer = ( theApp.is.Mac ? objects[0] : objects[0].getElementsByTagName('embed')[0] );
	}
};

p.setWmPlayer = function(){
	if ( this.wmPlayer )
		return;

	if ( theApp.is.ie ) {
		this.wmPlayer = document[this.audio.name + 'obj'];
	} else {
		var objects = this.div.getElementsByTagName('object');

		if ( objects && objects.length > 0 )
			this.wmPlayer = ( theApp.is.Mac ? objects[0] : objects[0].getElementsByTagName('embed')[0] );
	}
};

p.isPlaying = function(){
	return this.bPlaying;
};

p.isOldWM = function(player){
	return (player && theApp.is.ie && typeof player.playState != 'undefined'
			 && (typeof player.versionInfo == 'undefined') && this.audio.isResType(["mp3","wav","au","midi"]));
};

/**************************************************
JSWNDVIDEO
**************************************************/
function jsWndVideo(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndVideo.prototype = new jsWndObj();
p.constructor = jsWndVideo;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
	var THIS = this;
	jsWndObj.prototype.attach.call( THIS, uniqueName, data, 1);
	THIS.name = uniqueName;
	THIS.dCon = THIS.div.getElementsByTagName('DIV')[0];
	THIS.cwObj.isFlashVideo = function() {return data.isFlash;};
	THIS.cwObj.hasEvents = function(){return data.hasEvents;};
    THIS.cwObj.supportsEvents = function(){return data.supportsEvents;};
};

p.sizeTo = function(w,h){
	jsWndObj.prototype.sizeTo.call(this,w,h);
	if (this.cwObj.isFlashVideo)
		this.dCon.innerHTML = this.dCon.innerHTML.replace(/(width=[^0-9]*)[0-9.]*/ig, '$1'+w).replace(/(height=[^0-9]*)[0-9.]*/ig, '$1'+h);
};

p.onEvent = function(pname){
	// alert('onEvent: ' + 'name=[' + pname + ']');
	var THIS = this;
	if ( ! THIS.cwObj.hasEvents() )
		return;

	var myWndPage = THIS.designTime ? wndPage : trivPage ;

	trivArExec(THIS.cwObj.arEvents,
		function(o,i)
		{
			if ( o.name == pname )
				myWndPage.doAction(o.actItem,n,THIS.cwObj);
		});
};

p.onDone = function(){
	var THIS = this;
	var myWndPage = THIS.designTime ? wndPage : trivPage ;

	trivArExec(THIS.cwObj.arChld,
		function(o,i)
		{
			if ( o.type == ACTION && o.on == ON_DONE )
					myWndPage.doAction(o.actItem, o.elseItem,THIS.cwObj);
		});
};

p.play = function(){
    var THIS = this;
	if ((!THIS.editMode()) && THIS.dCon) {
		if(THIS.cwObj.isFlashVideo()){
			THIS.setFlashPlayer();
			if (THIS.flsLoading(THIS.flsPlayer))
			{
				theApp.SetTimeout(THIS.play,100,THIS);
				return;
			}
			THIS.flsPlayer.sendEvent('play');
		} else if ( THIS.cwObj.supportsEvents() && theApp.is.ie ) {
			THIS.setWmPlayer();
			if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.play();
		} else {
			var player = THIS.dCon.getElementsByTagName('embed');

			if ( player )
			{
				player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

				if ( typeof player.pause !== 'undefined' ) // WM
				{
					player.play();
				}
				else if ( typeof player.Step !== 'undefined' ) // QuickTime
				{
					var ps = player.GetPluginStatus();
					if ( !ps ) return;
					if ( ps.IContains('waiting') )
					{
						setTimeout(function(){THIS.play();},100);
						return;
					}
					if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
					player.Play();
				}
				else if ( typeof player.DoPause !== 'undefined' ) // Real
				{
					player.DoPlayPause();
				}
				else
				{
					var loop = ' loop="' + (THIS.cwObj.dwFlags & LOOP ? 'true' : 'false') + '"';
					THIS.dCon.innerHTML='<embed src="'+THIS.fn+'"'+THIS.showCont+THIS.strScale+' width=' + THIS.cwObj.rect.width + ' height=' + THIS.cwObj.rect.height + ' autostart="true"'+loop+'" />';
				}
			}
		}
		THIS.bPlaying=1;
	}
};

p.togglePlay = function(){
    var THIS = this;
	if ((!THIS.editMode()) && THIS.dCon) {
		if(THIS.cwObj.isFlashVideo()){
			THIS.setFlashPlayer();
			if (THIS.flsLoading(THIS.flsPlayer))
			{
				theApp.SetTimeout(THIS.togglePlay,100,THIS);
				return;
			}
			THIS.flsPlayer.sendEvent('playpause');
		} else if ( THIS.cwObj.supportsEvents() && theApp.is.ie ) {
			THIS.setWmPlayer();
			if ( THIS.wmPlayer && THIS.wmPlayer.controls ) {
				THIS.setPlayState(THIS.wmPlayer);
				if ( THIS.bPlaying )
					THIS.wmPlayer.controls.pause();
				else
					THIS.wmPlayer.controls.play();
			}
		} else {
			var player = THIS.dCon.getElementsByTagName('embed');

			if ( player )
			{
				player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );
				THIS.setPlayState(player); // play state doesn't seem to be correct on IE for WM

				if ( typeof player.pause !== 'undefined' ) // WM
				{
					if ( THIS.bPlaying ) player.pause();
					else player.play();
				}
				else if ( typeof player.Step !== 'undefined' ) // QuickTime
				{
					var ps = player.GetPluginStatus();
					if ( !ps ) return;
					if ( ps.IContains('waiting') )
					{
						setTimeout(function(){THIS.togglePlay();},100);
						return;
					}
					if ( ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
					if ( THIS.bPlaying ) player.Stop(); // or Step(0)
					else player.Play();
				}
				else if ( typeof player.DoPause !== 'undefined' ) // Real
				{
					player.DoPlayPause();
				}
			}
		}
		THIS.bPlaying=(THIS.bPlaying == 1 ? 0 : 1);
	}
};

p.pause = function(){
    var THIS = this;
	if ((!THIS.editMode()) && THIS.dCon) {
		if(THIS.cwObj.isFlashVideo()){
			THIS.setFlashPlayer();
			if (THIS.flsLoading(THIS.flsPlayer))
			{
				theApp.SetTimeout(THIS.pause,100,THIS);
				return;
			}
			THIS.flsPlayer.sendEvent('pause');
		} else if ( THIS.cwObj.supportsEvents() && theApp.is.ie ) {
			THIS.setWmPlayer();
			if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.pause();
		} else {
			var player = THIS.dCon.getElementsByTagName('embed');

			if ( player )
			{
				player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

				if ( typeof player.pause !== 'undefined' ) // WM
				{
					player.pause();
				}
				else if ( typeof player.Step !== 'undefined' ) // QuickTime
				{
					var ps = player.GetPluginStatus();
					if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
					player.Stop();
				}
				else if ( typeof player.DoPause !== 'undefined' ) // Real
				{
					player.DoPause();
				}
			}
		}
		THIS.bPlaying=0;
	}
};

p.stop = function(){
    var THIS = this;
	if ((!THIS.editMode()) && THIS.dCon) {
		if(THIS.cwObj.isFlashVideo()){
			THIS.setFlashPlayer();
			if (THIS.flsLoading(THIS.flsPlayer))
			{
				theApp.SetTimeout(THIS.stop,100,THIS);
				return;
			}
			THIS.flsPlayer.sendEvent('stop');
		} else if ( THIS.cwObj.supportsEvents() && theApp.is.ie ) {
			THIS.setWmPlayer();
			if ( THIS.wmPlayer && THIS.wmPlayer.controls ) THIS.wmPlayer.controls.stop();
		} else {
			var player = THIS.dCon.getElementsByTagName('embed');

			if ( player )
			{
				player = ( typeof player[0].controls == 'object' ? player[0].controls : player[0] );

				if ( typeof player.pause !== 'undefined' ) // WM
				{
					player.stop();
				}
				else if ( typeof player.Step !== 'undefined' ) // QuickTime
				{
					var ps = (typeof player.GetPluginStatus !== 'undefined' ? player.GetPluginStatus() : "complete"); // GetPluginStatus not available in QT with Flip4Mac playing WM media
					if ( ! ps || ! ps.IContains('complete') ) return; // plugin not ready or plugin does not handle format
					player.Stop();
					if ( typeof player.Rewind !== 'undefined' ) player.Rewind(); // Rewind not available in QT with Flip4Mac playing WM media
				}
				else if ( typeof player.DoPause !== 'undefined' ) // Real
				{
					player.DoStop();
				}
				else
				{
					THIS.dCon.innerHTML='<embed src="'+THIS.fn+'"'+THIS.showCont+THIS.strScale+' width=' + THIS.cwObj.rect.width + ' height=' + THIS.cwObj.rect.height + ' autostart="false" loop="false" />';
				}
			}
		}
		THIS.bPlaying=0;
	}
};

p.isPlaying = function(){
	return this.bPlaying;
};

p.setPlayState = function(player) {
	if ( ! player )
	{
		player = this.dCon.getElementsByTagName('embed');
		if ( player ) player = player[0];
	}

	this.bPlaying = jsWndVideo.getPlayState(player);

	return this.bPlaying;
};

jsWndVideo.getPlayState = function(player, bIsOldWM) {
	var controls = n;
	var type = "WM";
	var playerStatus = n;
	var isPlaying = n;

	if ( ! player ) return n;
	if ( typeof player.controls == 'object' ) controls = player.controls;

	if ( typeof player.playState != 'undefined' ) // WM
		playerStatus = player.playState;
	else if ( controls && typeof controls.playState != 'undefined' ) // WM
		playerStatus = controls.playState;
	else if ( typeof player.GetRate != 'undefined' ) // QT
	{
		type = "QT";
		var ps = player.GetPluginStatus();
		if ( ! ps || ! ps.IContains('complete') ) return playerStatus; // plugin not ready or plugin does not handle format
		playerStatus = player.GetRate();
	}
	else if ( controls && typeof controls.GetRate != 'undefined' ) // QT
	{
		type = "QT";
		var ps = controls.GetPluginStatus();
		if ( ! ps || ! ps.IContains('complete') ) return playerStatus; // plugin not ready or plugin does not handle format
		playerStatus = controls.GetRate();
	}
	else if ( typeof player.GetPlayState != 'undefined' ) // Real
	{
		type = "Real";
		playerStatus = player.GetPlayState();
	}
	else if ( controls && typeof controls.GetPlayState != 'undefined' ) // Real
	{
		type = "Real";
		playerStatus = controls.GetPlayState();
	}

	if ( type == 'WM' && playerStatus!==n ) {
		switch ( playerStatus )
		{
			case 2:  // ** Playback is paused
				isPlaying = (bIsOldWM)?t:f;
				break;

			case 0:  // ** The playback state is undefined
			case 1:  // ** Playback is stopped
			case 6:  // ** The player is buffering media
			case 7:  // ** The player is waiting for streaming data
			case 8:  // ** The player has reached the end of the media
			case 9:  // ** The player is preparing new media
			case 10: // ** The player is ready to begin playback
				isPlaying = f;
				break;

			case 3:  // ** The player is playing a stream
			case 4:  // ** The player is scanning a stream forward
			case 5:  // ** The player is scanning a stream in reverse
				isPlaying = t;
				break;
		}
	}
	else if ( type == 'QT' && playerStatus!==n )
	{
		if ( playerStatus == 0 ) // stopped or paused
			isPlaying = f;
		else // 1 is play, > 1 is fast forward, > 0 && < 1 is slow motion, < 0 is playing backwards
			isPlaying = t;
	}
	else if ( type == 'Real' && playerStatus!==n )
	{
		switch ( playerStatus )
		{
			case 0:  // ** stopped
			case 4:  // ** paused
				isPlaying = f;
				break;

			case 1:  // ** contacting
			case 2:  // ** buffering
			case 3:  // ** playing
			case 5:  // ** seeking
				isPlaying = t;
				break;
		}
	}

	return isPlaying;
};

p.setFlashPlayer = function(){
	if ( this.flsPlayer )
		return;

	if ( theApp.is.ie ) {
		this.flsPlayer = document['swf' + this.name];
	} else {
		var objects = this.dCon.getElementsByTagName('object');

		if ( objects && objects.length > 0 )
			this.flsPlayer = ( theApp.is.Mac ? objects[0] : objects[0].getElementsByTagName('embed')[0] );
	}
};

p.setWmPlayer = function(){
	if ( this.wmPlayer )
		return;

	if ( theApp.is.ie ) {
		this.wmPlayer = document[this.name + 'obj'];
	} else {
		var objects = this.dCon.getElementsByTagName('object');

		if ( objects && objects.length > 0 )
			this.wmPlayer = ( theApp.is.Mac ? objects[0] : objects[0].getElementsByTagName('embed')[0] );
	}
};

/**************************************************
JSWNDDOCUMENT
**************************************************/
function jsWndDocument(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndDocument.prototype = new jsWndObj();
p.constructor = jsWndDocument;
/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    THIS.dCon = THIS.div.getElementsByTagName('IFRAME')[0];
};

/**************************************************
JSWNDREFLIST
**************************************************/
function jsWndRefList(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndRefList.prototype = new jsWndObj();
p.constructor = jsWndRefList;

/**************************************************
JSWNDIPIX
**************************************************/
function jsWndIpix(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndIpix.prototype = new jsWndObj();
p.constructor = jsWndIpix;

/**************************************************
JSWNDOTHER
**************************************************/
function jsWndOther(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndOther.prototype = new jsWndObj();
p.constructor = jsWndOther;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data)
{
    var THIS = this;
    if (document.getElementById(uniqueName))
        jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    else
    	if (!THIS.cwObj) THIS.cwObj = {};

    trivArExec(THIS.arChld,function(o){if (!o.cwObj) o.cwObj={}; o.cwObj.par=THIS;});
};

/*
 * This is a publish mode only function
 */
p.moveGrp = function(xNew, yNew)
{
	var left = 9999;
	var top = 9999;
	var arChld = this.arChld;
	var x,y;
	for(var i=0; arChld && i < arChld.length; i++ ){
	    if (!arChld[i].div) continue;
		x = arChld[i].div.offsetLeft;
		y = arChld[i].div.offsetTop;
		if( x<left )left=x;
		if( y<top )top=y;
	}
	for(var i=0; arChld && i < arChld.length; i++ ){
	    if (!arChld[i].div) continue;
		x = arChld[i].div.offsetLeft;
		y = arChld[i].div.offsetTop;
		arChld[i].moveTo(x-(left-xNew),y-(top-yNew));
		arChld[i].bHasMoved=t;
	}
};

/*
 * This is a publish mode only function
 */
p.offset   = function( off ) {
  var maxY = 0;
  var arChld = this.arChld;
  for ( var i=0; arChld && i<arChld.length; i++ )
  {
     if (!arChld[i].div) continue;
	 arChld[i].div.style.top = String(arChld[i].div.offsetTop+off)+"px";
     var bottom = arChld[i].div.offsetTop + arChld[i].div.offsetHeight;
     if( maxY < bottom ) {maxY = bottom;}
  }

  return maxY;
};

p.show = function()
{
    if (this.div)
        return jsWndObj.prototype.show.call(this);
    trivArExec(this.arChld,function(o){if (o.show) o.show();});

};

p.hide = function()
{
    if (this.div)
        return jsWndObj.prototype.hide.call(this);
    trivArExec(this.arChld,function(o){if (o.hide) o.hide();});
};

p.toggleVisibility = function()
{
    if (this.div)
        return jsWndObj.prototype.toggleVisibility.call(this);
    trivArExec(this.arChld,function(o){if (o.toggleVisibility) o.toggleVisibility();});
};

p.pubRGUpdate = function()
{
	var val = this.cwObj.formVar.getValue();
	trivArExec(this.arChld,
		function(o)
		{
			if (o.constructor===jsWndFormRadio)
				o.setCheck(o.dCtrl.value == val);
		});
};


/**************************************************
JSWNDMENU
**************************************************/
function jsWndMenu(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndMenu.prototype = new jsWndObj();
p.constructor = jsWndMenu;
/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName,data){

    var i;
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    var cwObj = THIS.cwObj;
    cwObj.textColor = data.textColor;
    cwObj.bgHLColor = data.bgHLColor;
    cwObj.textHLColor = data.textHLColor;
    cwObj.bgColor = data.bgColor;
    cwObj.res = data.res;
    var arItems = [];
    cwObj.arItems = arItems;

	var sM = {};
    sM.textColor = data.subTextColor;
    sM.bgHLColor = data.subBgHLColor;
    sM.textHLColor = data.subTextHLColor;
    sM.bgColor = data.subBgColor;
    sM.res = data.subRres;
    cwObj.subMenu = sM;

    THIS.div = document.getElementById(uniqueName);
    THIS.div.tObj = THIS;
    THIS.div.bMain=1;

    var divs = document.getElementsByTagName("DIV");
    var menuDivs = [];
    var regExp = new RegExp("^[^0-9]*([0-9]*)");
    regExp.test(uniqueName);
    var idnum = RegExp.$1;
    regExp = new RegExp("^(tmenu|item)"+idnum+".*$");
    for (i=0;i < divs.length;i++)
        if (regExp.test(divs[i].id)) menuDivs.push(divs[i]);

    // save all menu items
    var mdiv;
    var rxItem = new RegExp("^item("+idnum+".*)$");
    for (i=0;i < menuDivs.length;i++)
    {
        mdiv = menuDivs[i];
        if (rxItem.test(mdiv.id)) // menu item
        {
            arItems.push( {id:mdiv.id,div:mdiv,attached:t} );
        }
    }


    for (i=0; i< arItems.length; i++)
    {
    	curNode = ((arItems[i]&&arItems[i].div)?arItems[i].div.parentNode:n);
    	while ( curNode && curNode.tagName == "DIV" )
    	{
    	 	if ( curNode.id && curNode.id.indexOf("tobj")==0 ) { arItems[i].div.bSub = 0; break; }
    	 	else if ( curNode.id && curNode.id.indexOf("tmenu")==0 ) { arItems[i].div.bSub = 1; break; }
    	 	curNode = curNode.parentNode;
    	}
    }

    // attach any pop menus [tie items to sub-menus if they have them]
    var rxMenu = new RegExp("^tmenu("+idnum+".*)$");
    for (i=0;i < menuDivs.length;i++)
    {
        mdiv = menuDivs[i];
        if (rxMenu.test(mdiv.id)) // get the menu
        {
            var popM = new jsPopMenu(THIS);
            popM.div = mdiv;
            mdiv.popM = popM;

             for (var j=0;j < arItems.length;j++)
             {
                 var menuItem = arItems[j];
                 // find the item which is it's parent
                 if (menuItem.id == "item"+RegExp.$1)
                 {
                     menuItem.popMenu = popM;
                     break;
                 }
             }
        }
    }
};

p.mouseDown = function(e){
	if(this.editMode())
	   return jsWndObj.prototype.mouseDown.call(this,e);
	else
	   menuMouseDown(e,this);
};

p.mouseUp = function(e){
	if(this.editMode())
	   return jsWndObj.prototype.mouseUp.call(this,e);
	else
	   menuMouseUp(e,this);
};

p.mouseMove = function(e){
	if(this.editMode())
	   return jsWndObj.prototype.mouseMove.call(this,e);
	else
	   menuMouseMove(e,this);
};

p.mouseEnter = function(){
	if(!this.editMode()) menuMouseEnter(this);
};

p.mouseExit = function(){
	if(!this.editMode()) menuMouseExit(this);
};

function menuMouseMove(e,obj){
	var div = n;
	var cwObj = obj.cwObj;
	if(e.target) div=e.target;
	else if(e.srcElement) div=e.srcElement;
	while(div){
		if(div && div.id && div.id.indexOf( 'item' ) == 0) break;
		div = div.parentNode;
	}
	if(div){
	    //console.log('wndobjs.menuMouseMove() div.id='+div.id);
		var item = menuFindItemByID(div.id,cwObj.arItems);
		var isSub;
		if(item){
			item.div=div;
			if(obj.currItem!=item){
			    isSub = div.bSub && div.bSub!=0;
				var mObj = isSub ? cwObj.subMenu : cwObj ;
				div.style.backgroundColor = ((mObj.bgHLColor==-1||mObj.bgHLColor=='')?'transparent':mObj.bgHLColor);
				div.style.color=mObj.textHLColor;
				if(item.arrow) menuChangeArrowColor(div,mObj.textHLColor);
				if(obj.currItem&&obj.currItem.div){
				    isSub = obj.currItem.div.bSub && obj.currItem.div.bSub!=0;
					var currMenuObj= isSub ? cwObj.subMenu : cwObj ;
				    obj.currItem.div.style.backgroundColor = ((currMenuObj.bgColor==-1||currMenuObj.bgColor==''|| currMenuObj.res)?'transparent':currMenuObj.bgColor);
					obj.currItem.div.style.color=currMenuObj.textColor;
					if(obj.currItem.arrow)
					   menuChangeArrowColor(obj.currItem.div,currMenuObj.textColor);
				}
				var curPopM = obj.currPopMenu;
				if( curPopM && curPopM != item.popMenu ){
					curPopM.hide();
					curPopM=0;
				}
				if(item.popMenu){
					item.popMenu.show();
					obj.currPopMenu=item.popMenu;
				}
				obj.currItem=item;
			}
		}
	}
}

function menuMouseEnter(obj){
	obj.mouseIn=1;
}

function menuMouseExit(obj){
	if(obj.currItem&&obj.currItem.div){
	    var isSub = obj.currItem.div.bSub && obj.currItem.div.bSub!=0;
		var menuObj= isSub ? obj.cwObj.subMenu : obj.cwObj ;
		var style = obj.currItem.div.style;
		style.backgroundColor = ((menuObj.bgColor==-1||menuObj.bgColor==''|| menuObj.res)?'transparent':menuObj.bgColor);
		style.color=menuObj.textColor;
		if(obj.currItem.arrow) menuChangeArrowColor(obj.currItem.div,menuObj.textColor);
	}
	obj.currItem=0;
	obj.mouseIn=0;
}

function menuMouseDown(e,obj){
	obj.bLButtonDown = 1;
}

function menuMouseUp(e,obj){
	if(obj.bLButtonDown){
		var div = n;
		if(e.target) div=e.target;
		else if(e.srcElement) div=e.srcElement;
		while(div){
			if(div && div.id && div.id.indexOf( 'item' ) == 0) break;
			div = div.parentNode;
		}
		if(div){
			var item = menuFindItemByID(div.id,obj.cwObj.arItems);
			if (item && !item.attached) // if not published
		    {
    			var parPage=obj.parPage;
    			var par = obj.par;
    			while(!parPage){
    				parPage=par.parPage;
    				par = par.par;
    			}
    			if(item&&!item.bSep&&!item.popMenu) parPage.doAction(item.actItem,n,obj);
            }
		}
	}
	obj.bLButtonDown = 0;
}

function menuFindItemByID(id,ar){
	for(var i=0;i<ar.length;i++){
		var item = ar[i];
		if(item.id == id) return item;
		if(item.arItems){
			item = menuFindItemByID(id,item.arItems);
			if(item) return item;
		}
	}
	return n;
}

function menuChangeArrowColor(div,clr){
	div=div.nextSibling;
	for(var i=0;i<4;i++){
		div.style.backgroundColor=clr;
		div=div.nextSibling;
	}
}

/**************************************************
JSPOPMENU
**************************************************/
function jsPopMenu(par){
    var THIS = this;
	THIS.par=par;
	THIS.mouseIn=0;
	THIS.timer=0;
	THIS.currItem=0;
	THIS.currPopMenu=0;
	THIS.cwObj = par.cwObj;
}
p = jsPopMenu.prototype;
p.show = function(){
    var THIS = this;
	THIS.div.style.visibility='visible';
	THIS.timer = setTimeout( function(){THIS.menuTimeOut();}, 1000);
};

p.hide = function(){
	this.div.style.visibility='hidden';
	if(this.timer) clearTimeout(this.timer);
	this.timer=0;
};

p.menuTimeOut = function(){
    var THIS = this;
	if(!THIS.div || THIS.div.style.visibility!='visible') return;
	if(!THIS.mouseIn&&!THIS.par.mouseIn&&!THIS.currPopMenu)
	{
		THIS.div.style.visibility='hidden';
		THIS.par.currPopMenu=0;
	}
	else
	   THIS.timer = setTimeout( function(){THIS.menuTimeOut();}, 1000);
};

p.mouseEnter = function(){
	menuMouseEnter(this);
};

p.mouseMove = function(e){
	menuMouseMove(e,this);
};

p.mouseExit = function(){
	menuMouseExit(this);
};

p.mouseDown = function(e){
	menuMouseDown(e,this);
};

p.mouseUp = function(e){
	menuMouseUp(e,this);
};

/**************************************************
JSWNDTOC
**************************************************/
function jsWndTOC(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndTOC.prototype = new jsWndObj();
p.constructor = jsWndTOC;
/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    var tag = data.iAppear==TOC_COMBO?'SELECT':'DIV';
    THIS.dCon = THIS.div.getElementsByTagName(tag)[0];
};

/*
 * This is a publish mode only function TOC - tree view
 */
p.expand = function(expandImg,plusImage,minusImage)
{
	if(expandImg.style.visibility=='hidden')return;
	var parentNode = expandImg.parentNode;
	if(expandImg.src.indexOf(plusImage)>=0)
	{
		expandImg.src = expandImg.src.replace(plusImage,minusImage);
		var ul = parentNode.getElementsByTagName('UL')[0];
		ul.style.display='block';
	}
	else if(expandImg.src.indexOf(minusImage)>=0)
	{
		expandImg.src = expandImg.src.replace(minusImage,plusImage);
		parentNode.getElementsByTagName('UL')[0].style.display='none';
	}
	return f;
};


/**************************************************
JSWNDPROGRESSBAR
**************************************************/
function jsWndProgressBar(){
	jsWndObj.prototype.constructor.call( this );
	this.barPos=0;
	this.step=0;
	this.range=0;
}
p = jsWndProgressBar.prototype = new jsWndObj();
p.constructor = jsWndProgressBar;
/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    var cwObj = THIS.cwObj;
    THIS.dCon = THIS.div.getElementsByTagName('DIV')[0];
    THIS.dBkgnd = THIS.dCon.getElementsByTagName('DIV')[0];
    THIS.dBar = THIS.dBkgnd.getElementsByTagName('DIV')[0];
    THIS.step = data.step;
    THIS.range = data.range;
    THIS.barPos = data.barPos;
    cwObj.tickTime = data.tickTime;
    cwObj.dwBarFlags = data.dwBarFlags;
    if(cwObj.dwBarFlags&PB_AUTO_START) THIS.play();
};

p.stepIt = function(){
	return this.setBarPosition(Number(this.barPos)+Number(this.step));
};

p.setPosition = function(pos){
	if(this.cwObj.dwBarFlags&PB_TYPE_CUSTOM) return this.setBarPosition(pos);
};

p.isPlaying = function(){
	return ((this.cwObj.dwBarFlags&PB_TYPE_TIMER) && this.timer);
};

p.play = function(){
    var THIS = this;
	if(!THIS.cwObj.dwBarFlags&PB_TYPE_TIMER) return 0;
	else if(THIS.timer) return THIS.barPos;
	else{
		THIS.timer = setTimeout( function(){THIS.onTimer();}, THIS.cwObj.tickTime);
		return 1;
	}
};

p.stop = function(){
    var THIS = this;
    THIS.pause();
	THIS.setBarPosition(0);
	return 0;
};

p.pause = function(){
    var THIS = this;
	if(!THIS.cwObj.dwBarFlags&PB_TYPE_TIMER) return 0;
	else if(THIS.timer){
		clearTimeout(THIS.timer);
		THIS.timer = 0;
	}
	return THIS.barPos;
};

p.onTimer = function(){
	var THIS=this;
	if(THIS.stepIt() >= THIS.range){
		THIS.timer=0;
		if(THIS.actFlags&FLAG_DONE) THIS.issueActions(ON_DONE);
	}
	else
		THIS.timer = setTimeout( function(){THIS.onTimer();}, THIS.cwObj.tickTime);
};

p.setBarPosition = function(pos){
	if(typeof pos != 'number'||isNaN(pos)) pos=0;
	var THIS = this;
	if(pos > THIS.range) pos=THIS.range;
	else if(pos<0) pos=0;
	THIS.barPos = pos;
	var pixBarPos=pos/THIS.range;

	var dwBarFlags = THIS.cwObj.dwBarFlags;
	var style = THIS.dBar.style;
	if(dwBarFlags&PB_DRAW_VERT){
		pixBarPos *= THIS.rtRect.height;
		if(dwBarFlags&PB_DRAW_DRAIN) pixBarPos = THIS.rtRect.height-pixBarPos;
		style.left='0px';
		style.top=(THIS.rtRect.height-pixBarPos) + 'px';
		style.width='100%';
		style.height=(pixBarPos-2>0?pixBarPos-2:0) + 'px';
	}else{
		pixBarPos *= THIS.rtRect.width;
		if(dwBarFlags&PB_DRAW_DRAIN) pixBarPos = THIS.rtRect.width-pixBarPos;
		style.left='0px';
		style.top='0px';
		style.width=(pixBarPos-2>0?pixBarPos-2:0) + 'px';
		style.height='100%';
	}
	return pos;
};

jsWndProgressBar.prototype.createBarImgs = function(){
    var THIS = this;
    var dwBarFlags = THIS.cwObj.dwBarFlags;
	//remove any old images
	var oldImgs = THIS.dBar.getElementsByTagName('img');
	for(var i=0; i<oldImgs.length; i++) THIS.dBar.removeChild(oldImgs[i]);
	if(THIS.bImg){
		var lim=dwBarFlags&PB_DRAW_VERT?THIS.rtRect.height:THIS.rtRect.width;
		var inc=dwBarFlags&PB_DRAW_VERT?THIS.bImg.height:THIS.bImg.width;
		for(var i=0; i<lim; i+=inc){
			var img = document.createElement('img');
			img.src=THIS.bImg.src;
			img.style.position='absolute';
			if(dwBarFlags&PB_DRAW_VERT){
				img.style.left='0px';
				img.style.top=i + 'px';
				img.style.width='100%';
				img.style.height=THIS.bImg.height + 'px';
			}else{
				img.style.left=i + 'px';
				img.style.top= '0px';
				img.style.width=THIS.bImg.width + 'px';
				img.style.height='100%';
			}
			THIS.dBar.appendChild(img);
		}
	}
};

/**************************************************
JSWNDFORM
**************************************************/
function jsWndForm(){}
/*
 * This is a publish mode only function
 */
jsWndForm.prototype.attach = function(uniqueName, data)
{
    var cwObj = this.cwObj;
    cwObj.objType = FORMBASE;
    cwObj.formType = data.formType;
    cwObj.dwFormFlags = data.dwFormFlags;
};

/**************************************************
JSWNDFORMENTRY
**************************************************/
function jsWndFormEntry(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndFormEntry.prototype = new jsWndObj();
p.constructor = jsWndFormEntry;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    jsWndForm.prototype.attach.call( THIS, uniqueName, data );
    var tas = THIS.div.getElementsByTagName('textarea');
    THIS.dCon = (tas && tas.length ? tas[0]:THIS.div.getElementsByTagName('input')[0]);
    THIS.cwObj.iNumChars = data.iNumChars;
};

/*
 * This is a publish mode only function
 */
p.update = function(fvar, max, err)
{
    var dCon = this.dCon;
    if (dCon.value.length > max)
    {
        alert(err);
        dCon.value = dCon.value.substring(0,max);
        dCon.focus();
        dCon.select();
        return f;
    }
    fvar.set(dCon.value);
    return ;
};

p.changeContents = function(txt){
	this.dCon.value=txt;
	if(this.cwObj.formVar) this.cwObj.formVar.set(txt);
};

p.reset = function()
{
	this.dCon.value=this.cwObj.strDefValue;
	this.onChange();
};

/**************************************************
JSWNDFORMRADIO
**************************************************/
function jsWndFormRadio(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndFormRadio.prototype = new jsWndObj();
p.constructor = jsWndFormRadio;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    jsWndForm.prototype.attach.call( THIS, uniqueName, data );
    THIS.name = uniqueName;
    var dCon = THIS.div.getElementsByTagName('DIV')[0];
    THIS.dCon = dCon;
    THIS.dCtrl = dCon.getElementsByTagName('INPUT')[0];
};

p.setCheck = function(bCheck){
	this.dCtrl.checked=bCheck;
};

p.getCheck = function(){
	return this.dCtrl.checked;
};

p.changeContents = function(txt){
	if(txt.length==0) this.dCtrl.checked=f;
	else this.dCtrl.checked=t;
	if(this.cwObj.formVar) this.cwObj.formVar.set(txt);
};

p.reset = function(bNoChange)
{
	this.dCtrl.checked=(this.cwObj.dwFormFlags&RADIO_CHECKED);
	if(!bNoChange) this.onChange();
};

p.onClick = function(e)
{
	if(this.cwObj.formType==FORM_RADIO) this.setCheck(1);
	if(this.designTime) return this.onChange();
};

/**************************************************
JSWNDFORMLIST
**************************************************/
function jsWndFormList(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndFormList.prototype = new jsWndObj();
p.constructor = jsWndFormList;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data );
    jsWndForm.prototype.attach.call( THIS, uniqueName, data );
    var dCon = THIS.div.getElementsByTagName('SELECT')[0];
    THIS.dCon = dCon;
};

p.changeContents = function(txt){
	this.setSel(txt);
	if(this.cwObj.formVar) this.cwObj.formVar.set(txt);
};

p.reset = function()
{
    var THIS = this;
	var selIndex = -1;
	for(var i=0; THIS.cwObj.arItems&&i<THIS.cwObj.arItems.length; i++){
		var item = THIS.cwObj.arItems[i];
		if(item.bSel){
			if(THIS.cwObj.dwFormFlags&LIST_MULTISELECT) THIS.dCon.options[i].selected=t;
			else selIndex=i;
		}
		else if(THIS.cwObj.dwFormFlags&LIST_MULTISELECT) THIS.dCon.options[i].selected=f;
	}
	if(!(THIS.cwObj.dwFormFlags&LIST_MULTISELECT)) THIS.dCon.selectedIndex=selIndex;
	if (THIS.onChange) THIS.onChange(); // not always there at publish time.
};

p.setSel = function(val){
    if (!val) return;
	if(this.cwObj.dwFormFlags&LIST_MULTISELECT){
	    var options = this.dCon.options;
		for(var i=0;i<options.length;i++){
			// before op.label is either beginning of string or a comma
			// after op.label is either end of string or a comma
			var regEx = new RegExp("(?:^|[,])"+options[i].label+"(?:$|[,])");
			if (regEx.test(val)) options[i].selected=t;
			else options[i].selected=f;
		}
	}else this.dCon.value=val;
};

p.getSel = function(){
	if(this.cwObj.dwFormFlags&LIST_MULTISELECT){
		var val='';
		var options = this.dCon.options;
		for(var i=0;i<options.length;i++)
			if(options[i].selected) val += (val.length==0?'':',') + options[i].label;
		return val;
	}else return this.dCon.value;
};

/**************************************************
JSWNDTESTTIMER
**************************************************/
function jsWndTestTimer(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndTestTimer.prototype = new jsWndObj();
p.constructor = jsWndTestTimer;

p.changeContents = function( elapsedTime )
{
    if (this.div) (this.div.getElementsByTagName('DIV')[0]).innerHTML = elapsedTime;
};

/**************************************************
JSWNDTEXT
**************************************************/
function jsWndText(){
	jsWndObj.prototype.constructor.call( this );
}
p = jsWndText.prototype = new jsWndObj();
p.constructor = jsWndText;

/*
 * This is a publish mode only function
 */
p.attach = function(uniqueName, data){
    var THIS = this;
    jsWndObj.prototype.attach.call( THIS, uniqueName, data, 1 );
    THIS.cwObj.dwTextFlags = data.dwTextFlags;
    THIS.cwObj.borderSize = data.borderSize;
    THIS.cwObj.marginSize = data.marginSize;

    trivArExec(THIS.div.getElementsByTagName('DIV'),
    	function(o)
    	{
			if (o.getAttribute("name")=="dCon")
				THIS.dCon = o;
			else if (o.getAttribute("name")=="dCon2")
				THIS.dCon2 = o;
			if (THIS.dCon && THIS.dCon2) return f; // breaks loop
    	});
};

p.changeContents = function(txt,cnt){

	// make sure we are ready to go to work
	var THIS = this;
	if ( THIS.dCon2==n || THIS.inWriteContent) {
		if (!cnt || cnt < 10) setTimeout(function(){THIS.changeContents(txt, (cnt?++cnt:1));},200);
		//if(window.console)console.log('wndtext: retry->changeContents['+cnt+']');
		return;
	}

	var div = THIS.dCon2;
	var bold=0;
	var ital=0;
	var uline=0;
	var face=0;
	var size=0;
	var color=0;
	var align='left';
	var hasAncestor = jsWndText.hasAncestor;

	//find the first text node, get its attributes
	var node=jsWndText.getFirstTextNode(div);
	if(node){
		var parNode = node.parentNode;
		if(hasAncestor( parNode, div, "STRONG" )) bold=1;
		if(hasAncestor( parNode, div, "EM" )) ital=1;
		if(hasAncestor( parNode, div, "U" )) uline=1;
		var font=hasAncestor( parNode, div, "SPAN" );
		while ( font !== n && (face==0 || size==0 || color==0) )
		{
			if(!face && font.style.fontFamily) face=font.style.fontFamily;
			if(!size && font.style.fontSize) size=font.style.fontSize;
			if(!color && font.style.color) color=font.style.color;
			font=hasAncestor( font.parentNode, div, "SPAN" );
		}
		var pTag=hasAncestor(node, div, "P");
		if(pTag) align = pTag.getAttribute("align");
	}
	//build the inner HTML
	var newtxt='<p align="'+align+'">'+
	           '<span style="font-size:'+(size?size:'10pt')+';color:'+(color?color:'#000000')+';'+
	           'font-family:'+(face?face:"'Arial',sans serif")+'">';
	if(bold) newtxt+= '<strong>';
	if(ital) newtxt+= '<em>';
	if(uline) newtxt+= '<u>';
	if( txt!="~~~null~~~")
	   newtxt += txt;
	if(bold) newtxt+= '</strong>';
	if(ital) newtxt+= '</em>';
	if(uline) newtxt+= '</u>';
	div.innerHTML = newtxt + '</span></p>';
};

p.sizeTo = function(w,h){

    var THIS = this;

    // check limits
    var bSize = THIS.cwObj.borderSize;
    var mSize = THIS.cwObj.marginSize;
    var oSize = (this.cwObj.dwTextFlags & TEXT_OUTLINE?2:0);
    var bSizes = bSize*2 + oSize;
    if (w < bSizes) w = bSizes;
    if (h < bSizes) h = bSizes;
    // rtRect
	THIS.rtRect.width = w;
	THIS.rtRect.height = h;
	THIS.div.style.width = w + 'px';
	THIS.div.style.height = h + 'px';
	// dCon
	THIS.setdConWidth();
	THIS.setdConHeight();
	// dCon2
	var offset = (bSize + mSize) + 'px';
	THIS.dCon2.style.left = offset;
	THIS.dCon2.style.top = offset;
	THIS.setTxtWidth( THIS.dCon2 );
	THIS.setTxtHeight( THIS.dCon2 );
	// borders
	if (bSize)
	{
		var sideHeight = (h - bSizes)+'px';
		var sideWidth = (w - bSizes)+'px';
		var botOffset = (h - bSize - oSize)+'px';
		var rightOffset = (w - bSize - oSize)+'px';
		var divs = THIS.dCon.getElementsByTagName("DIV");
		for(var i=0; i<divs.length; i++) {
			var id = divs[i].id;
			if (id)
			{
				if (id=='tbbt') // top middle
					divs[i].style.width=sideWidth;
				else if (id=='tbbb') // bottom middle
				{
					divs[i].style.width=sideWidth;
					divs[i].style.top=botOffset;
				}
				else if (id=='tbbl') // left side
					divs[i].style.height=sideHeight;
				else if (id=='tbbr') // right side
				{
					divs[i].style.height=sideHeight;
					divs[i].style.left=rightOffset;
				}
				else if (id=='tbbbl') // bot left
					divs[i].style.top=botOffset;
				else if (id=='tbbtr') // top right
					divs[i].style.left=rightOffset;
				else if (id=='tbbbr') // bot right
				{
					divs[i].style.left=rightOffset;
					divs[i].style.top=botOffset;
				}
			}
		}
	}

};

p.setdConWidth = function()
{
	this.dCon.style.width  = (this.rtRect.width - (this.cwObj.dwTextFlags & TEXT_OUTLINE?2:0)) + 'px';
};

p.setdConHeight = function()
{
	this.dCon.style.height = (this.rtRect.height - (this.cwObj.dwTextFlags & TEXT_OUTLINE?2:0)) + 'px';
};

p.setTxtWidth = function( div )
{
	var w = (this.rtRect.width - this.cwObj.borderSize*2 - this.cwObj.marginSize*2);
	div.style.width  = ( w < 0 ? 0 : w ) + 'px';
};

p.setTxtHeight = function( div )
{
	var h = (this.rtRect.height - this.cwObj.borderSize*2 - this.cwObj.marginSize*2);
	div.style.height = ( h < 0 ? 0 : h ) + 'px';
};

jsWndText.getFirstTextNode = function(startNode)
{
	if( startNode.nodeType==3 && startNode.nodeValue != "\n" )
	   return startNode;
	else
	{
	   for(var j=0;j<startNode.childNodes.length;j++)
	   {
			var node = jsWndText.getFirstTextNode(startNode.childNodes[j]);
			if(node) return node;
	   }
	}
	return n;
};

jsWndText.hasAncestor = function( startNode, topNode, ancestorTag )
{
	while ( startNode != topNode )
	{
		if (startNode.nodeType == 1 &&
		    startNode.tagName.toUpperCase() == ancestorTag.toUpperCase() )

			return startNode;

		startNode = startNode.parentNode;
	}
	return n;
};

// This function is needed when running in published mode for
// matching questions.
function wndPageDrawLine(xStart, yStart, xEnd, yEnd){
	//We work left to right
	if(xStart > xEnd){
		var t=xStart;
		xStart=xEnd;
		xEnd=t;
		t=yStart;
		yStart=yEnd;
		yEnd=t;
	}
	//First create an encompassing div
	var boxWidth = Math.abs(xEnd - xStart);
	var boxHeight = Math.abs(yEnd - yStart);
	var lineSize = 3;
	var ccRight = 0, ccLeft = 0, ccTop = 0, ccBottom = 0;
	var lineDiv = document.createElement('div');
	lineDiv.id = 'line';
	var style = lineDiv.style;
	style.position = 'absolute';
	style.left = Math.min(xStart,xEnd) + 'px';
	style.top = Math.min(yStart,yEnd) + 'px';
	style.width = boxWidth + 'px';
	style.height = boxHeight + 'px';
	this.div.appendChild(lineDiv);

	var addLinePart = function(par,l,t,w,h)
	{
		var div = document.createElement('div');
		var divStyle = div.style;
		divStyle.position='absolute';
		divStyle.left = l+'px';
		divStyle.top = t+'px';
		divStyle.width = w+'px';
		divStyle.height = h+'px';
		divStyle.backgroundColor="#0000FF";
		divStyle.overflow='hidden';
		par.appendChild(div);
	};

    if(boxWidth > boxHeight){
    	ccRight=0;
        ccTop=0;
        while(ccRight<boxWidth)
        {
        	ccLeft=ccRight;
          	while ((Math.round(ccRight*boxHeight/boxWidth)==ccTop)&&(ccRight<=boxWidth))
          		ccRight++;
			addLinePart(lineDiv, ( yEnd > yStart ? ccLeft : (boxWidth-ccRight)), ccTop, (ccRight-ccLeft+lineSize), lineSize);
          	ccTop++;
        }
    }else{
    	ccBottom=0;
        ccLeft=0;
        while( ccBottom < boxHeight ){
        	ccTop=ccBottom;
          	while((Math.round(ccBottom*boxWidth/boxHeight)==ccLeft)&&(ccBottom<boxHeight))
          		ccBottom++;
			addLinePart(lineDiv, ( yEnd > yStart ? ccLeft : (boxWidth-ccLeft)), ccTop, lineSize, (ccBottom-ccTop+lineSize));
          	ccLeft++;
        }
	}
	return lineDiv;
}
p = n;
