function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/*******************  Show and hide element *******************/
function displayElement(id, show)
{
    
	if(document.layers)
	{
		if (show == null)
		{
			show = (document.layers[id].display == 'inline') ? false : true;
		}
		document.layers[id].display = (show) ? 'inline' : 'none';
		//alert(id + ' layer');
	}
	else if(document.all)
	{
		if (show == null)
		{
			show = (document.all[id].style.display == 'inline') ? false : true;
		}
		document.all[id].style.display = (show) ? 'inline' : 'none';
		//alert(id + ' all');
	}
	else if(document.getElementById)
	{
		if (show == null)
		{
			show = (document.getElementById(id).style.display == 'inline') ? false : true;
		}
		document.getElementById(id).style.display = (show) ? 'inline' : 'none';
		//alert(id + ' get');
	}
	return show;
}

/*********************************************************************************************************/
function ref(instance_or_id){
    return(typeof(instance_or_id)=="string")?document.getElementById(instance_or_id):instance_or_id;
}

function hasClass(element,_className) {
    if(!element) {
        return;
    }
    var upperClass = _className.toUpperCase();
    if(element.className) {
        var classes=element.className.split(' ');
        for(var i=0;i<classes.length;i++) {
            if(classes[i].toUpperCase()==upperClass) {
                return true;
            }
        }
    }
    return false;
}

function addClass(element,_class) {
    if(!hasClass(element,_class)) {
        element.className+=element.className?(" "+_class):_class;
    }
}

function getClassList(element){
    if(element.className){
        return element.className.split(' ');
    }else{
        return[];
    }
}

function removeClass(element,_class) {
    var upperClass=_class.toUpperCase();
    var remainingClasses=[];
    if(element.className) {
        var classes=element.className.split(' ');
        for(var i=0;i<classes.length;i++) {
            if(classes[i].toUpperCase()!=upperClass) {
                remainingClasses[remainingClasses.length]=classes[i];
            }
        }
        element.className=remainingClasses.join(' ');
    }
}

function getDisplayStyleByTagName(o) {
    var n = o.nodeName.toLowerCase();
    return(n=="span"||n=="img"||n=="a")?"inline":(n=='tr'||n=='td'?"":"block");
}

function showDiv(divName) {
    var tempDiv=ref(divName);
    if(!tempDiv) {
        return;
    }
    if(hasClass(tempDiv,"wasinline")) {
        tempDiv.style.display="inline";
        removeClass(tempDiv,"wasinline");
    } else if(hasClass(tempDiv,"wasblock")) {
        tempDiv.style.display="block";
        removeClass(tempDiv,"block");
    } else {
        tempDiv.style.display=getDisplayStyleByTagName(tempDiv);
    }   
}

function hideDiv(divName){
    var tempDiv=ref(divName);
    if(!tempDiv) {
        return;
    }
    if(tempDiv.style.display=="inline") {
        addClass(tempDiv,"wasinline");
    }else if(tempDiv.style.display=="block") {
        addClass(tempDiv,"wasblock");
    }
    tempDiv.style.display="none";
}

function hideDivAfter(divName,delay){
    window.setTimeout(function(){
        hideDiv(divName)
    },delay);
}

function goExpan(id) {
    var ele = document.getElementById(id);
    var wrap = document.getElementById(id +'-wrap');
    var factor = 15;
    var newVal = 0;

    //  do width first
    if(parseInt(wrap.style.width) < ele.clientWidth) {
        newVal = (parseInt(wrap.style.width) + factor);
        
        if(newVal >= ele.clientWidth) {
            newVal = ele.clientWidth + 3;
        }
    
        wrap.style.width = newVal.toString() + 'px';
        window.setTimeout('goExpan("'+ id +'")',1);
    }
    // now the height
    else if(parseInt(wrap.style.height) < ele.clientHeight) {
        newVal = (parseInt(wrap.style.height) + factor);

        if(newVal >= ele.clientHeight) {
            newVal = ele.clientHeight + 3;
        }

        wrap.style.height = newVal.toString() + 'px';
        window.setTimeout('goExpan("'+ id +'")',1);
    }
    // finally, hide the wrap and display element
    else {
        ele.style.visibility = 'visible';
        window.setTimeout(function() {wrap.style.visibility = 'hidden'}, 1000);
    }
}

/*****************************************************************************/

/*
function fade(id, step, current) {
    document.getElementById(id+"_wraper").style.backgroundImage = '';
    ie5  = (document.all && document.getElementById);
    ns6 = (!document.all && document.getElementById);
    var ele = document.getElementById(id);
    //opac = 0;
 

    if(current < 100){
        current+=20;
        if(ie5) ele.filters.alpha.opacity = current;
        if(ns6) ele.style.MozOpacity = current/100;
        setTimeout('fade("'+ id +'",'+ step +','+ current +')', 50);
    }
    else if(ie5) {
        ele.style.cssText = ele.style.cssText.replace(/FILTER:[^;]*;?/i,'');   
    }
    return;

/*    
    current += step;
    
    if(current > 100) {
        current = 100;
        document.getElementById(id+"_wraper").style.backgroundImage = '';
    }
    else if(current < 0) {
        current = 0;
        document.getElementById(id+"_wraper").style.backgroundImage = '';
    } 
    
    document.getElementById(id).style.opacity = (current/100);
    document.getElementById(id).style.filter = "Alpha(Opacity="+ current +")";
    
    
    if((current < 100) && (current > -0)) {
        window.setTimeout('fade("'+ id +'",'+ step +','+ current +')',50);
    }
    else if(!(current <= -0)) {
        document.getElementById(id).style.cssText = document.getElementById(id).style.cssText.replace(/FILTER:[^;]*;?/i,'');
    }    
    
    return false;        

}
*/

function setOpacity(obj, opacity) {
    opacity = (opacity == 100)?99.999:opacity;

    // IE/Win
    obj.style.filter = "alpha(opacity:"+opacity+")";

    // Safari<1.2, Konqueror
    obj.style.KHTMLOpacity = opacity/100;

    // Older Mozilla and Firefox
    obj.style.MozOpacity = opacity/100;

    // Safari 1.2, newer Firefox and Mozilla, CSS3
    obj.style.opacity = opacity/100;
}

function fadeIn(objId,opacity) {
    if(document.getElementById) {
        obj = document.getElementById(objId);
        
        if(opacity <= 100) {
            setOpacity(obj, opacity);
            opacity += 20;
            window.setTimeout("fadeIn('"+objId+"',"+opacity+")", 35);
        }
        else {
            obj.parentNode.style.background = '#000000';
        }
    }
}

function fadeImage(imageId) {
    var image = document.getElementById(imageId);
    //document.getElementById(imageId + '_wraper').style.backgroundImage = '';
    setOpacity(image, 0);
    image.style.visibility = "visible";
    fadeIn(imageId,0);
}


function switchMenu(imgIn, ImgOut, menuId)
{
	var state = displayElement(menuId) ? 1 : 0;
	var src = state ? '../img/downmenu.jpg' : '../img/upmenu.jpg';
	var url = 'menuId=' + menuId + '&state=' + state;
	http.open('get', 'scripts/session_update.php?' + url);
	http.send(null);
	
	return src
}

function getLabelForId(id) {
 var label, labels = document.getElementsByTagName('label');
 for (var i = 0; (label = labels[i]); i++) {
   if (label.htmlFor == id) {
     return label;
   }
 }
 return false;
} 

/********  Display message at the top of the page  ****************/
function showMsg(msg)
{
	if(timeOut != '')
	{
		window.clearTimeout(timeOut);
		timeOut = '';
	}
	document.getElementById('msgTd').setAttribute('background', '../img/msgbox.jpg');
	document.getElementById('msgTxt').innerHTML = msg;
	timeOut = window.setTimeout('resetMsg()', 4000);
}

function resetMsg()
{
	document.getElementById('msgTd').setAttribute('background', '');
	document.getElementById('msgTxt').innerHTML = '';
}

/********  Maybe to be removed  ****************/
function setElementClass(id, className)
{
	if(document.all)
	{
		document.all[id].className = className;
	}
	else if(document.getElementById)
	{
		document.getElementById(id).className = className;
	}
}

/*************  Check Box Functions  *************************/
//  Check all the checkboxes in the a form
function checkBoxAcc(selectBox, form)
{	
	var elements = form.elements;
	for (i = 0; i < elements.length; i++) 
	{
		if (elements[i].type == 'checkbox' && !elements[i].disabled)
		{
			elements[i].checked = selectBox.checked;
		}
	}
}

//  Return all the values in the check boxes separated by a ,
function checkBoxIds(formId) {
	var ids = '';
	var form  = document.getElementById(formId);
	
	for (var i=0 ;i < form.elements.length; i++) {
		var element = form.elements[i];
		//if ((element.type=='checkbox')&&(element.id=='ids[]')&&(element.checked==true))
		if ((element.type=='checkbox') && (element.checked==true)) {
			ids += element.value + '","';
		}
	}
	
	if(ids != '') {
		ids = '"'+ ids.substr(0, (ids.length - 2));
	}
	
	return ids;
}

//  @rootNode *     null        The root node of an XML document (ie. the .documentElement from the xml reponse from httpRequestObj above)
//  Return          Object      An object representation of the XML DOM
//  Description                 This function can be use to parse an xml string into an object like structure. In this way
//                              you can access tags as instance of variables.  It also handles the difference between
//                              IE and Mozilla as how they interpret text between nodes (we like IE behaviour better).
//                              Note that XML message must be rapt around an envelop/root tag.
//                              eg.  <result>1</result> must be rewrite as <message><result>1</result></message>
function parseXml(rootNode) {
    var nodeXml = new Object();
    for(var i = 0; i < rootNode.childNodes.length; i++) {
        if(rootNode.childNodes[i].nodeName != '#text') {       
            if(nodeXml[rootNode.childNodes[i].nodeName] == null) {
                nodeXml[rootNode.childNodes[i].nodeName] = new Array();
            }
            if((rootNode.childNodes[i].childNodes.length == 1) && (rootNode.childNodes[i].childNodes[0].nodeType == 3)) {
                nodeXml[rootNode.childNodes[i].nodeName].push(rootNode.childNodes[i].childNodes[0].nodeValue);
            }
            else {
                nodeXml[rootNode.childNodes[i].nodeName].push(parseXml(rootNode.childNodes[i]));
            }
        }
    } 
    return nodeXml;
} 



/**********************  AJAX FUNCTIONS  *********************/
function createRequestObject()
{
	var _request = false;

	try {
		_request = new XMLHttpRequest();
	} 
	catch(ms1) {
		try	{
			_request = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (ms2) {
			try {
				_request = new ActiveXObject("Microsoft.XMLHTTP");
	  		} 
			catch (failed) {
				_request = false;
	  		}
		}
	}

	if (!_request)
    	alert("Error initializing XMLHttpRequest!");
		
	return _request;
}

function deleteSelection(href, formId, posFunc)
{
	if(document.getElementById(formId))
	{
		var ids = checkBoxIds(formId);
		if(ids != '')
		{
			if(confirm('All selected item(s) will be deleted.  Are you sure?'))
			{
				http.open('get', href + ids);
				http.onreadystatechange = eval(posFunc);
				//http.onreadystatechange = handlePage;
				http.send(null);
				showMsg('Deleting...');
			}
		}
		else
		{
			alert('No items selected!');
		}
	}
}

/*********************************************************/

var imageObjType = '';
var imageObjId = '';
var imageloderWin = '';

function openImageLoader(loaderMode, imageDiv) {
    //  This seems to creade the handler without reseting the page!
    //imageloderWin = window.open('', 'imageloaderWin', 'alwaysRaised, resizable, dependent, scrollbars, menubar, ');
    
    if((imageloderWin == '') || (imageloderWin.closed)) {
    //if(imageloderWin.loaderMode == '') {
        imageloderWin = window.open('imageloader.php?loadermode='+ loaderMode +'&imageDiv='+ imageDiv, 'imageloaderWin', 'alwaysRaised, resizable, dependent, scrollbars, menubar, ');
    }
    else {
        imageloderWin.loaderMode = loaderMode;
        imageloderWin.imageDiv = imageDiv;
    }
    
    
    imageloderWin.focus();
}

function saveImageReference(fieldId, imageId, dontRender) {
    var url = 'acc=saveRef&objType='+ imageObjType +'&objId='+ imageObjId  +'&fieldId='+ fieldId  +'&imageId='+ imageId;
	http.open('post', 'scripts/imageloader_script.php');
	http.onreadystatechange = function() {};
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.send(url); 
	
	
	if(dontRender == null) {
    	renderImage(imageId, fieldId);
    }  
    
    imageObjType = '';
    imageObjId = ''; 
}

function renderImage(imageId, imageDiv) {
    if(imageId != '') {
        var url = 'acc=getImage&imageId='+ imageId +'&eleId='+ imageDiv;
    	http.open('post', 'scripts/imageloader_script.php');
    	http.onreadystatechange = function() { 
    	    var xml = http.responseXML;
    	    var xmlObj = parseXml(xml.documentElement);
    	    document.getElementById(xmlObj.image).innerHTML = xmlObj.wraper;
    	    //document.getElementById(imageDiv).innerHTML = http.responseText; 
    	};
    	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	http.send(url);    
    	document.getElementById(imageDiv +'AddImage').style.display = 'none';
    }
    else {
        document.getElementById(imageDiv).innerHTML = '';
        document.getElementById(imageDiv +'AddImage').style.display = 'inline';
    } 
}

function editImage(fieldId) {
    document.getElementById(fieldId).innerHTML = '';
    document.getElementById(fieldId +'AddImage').style.display = 'inline';
    openImageLoader(1,fieldId);
}

function deleteImage(fieldId) {
    var check = confirm('Are you sure you want to remove this image?');
    
    if(check) {
        saveImageReference(fieldId, '');
    }
}
/************************  CSS Preview  ************************/
//  Thanks: http://www.cssportal.com/ (with mods)
function doCSSPreview(objTxa, strIFrame, showAll) {
	var strCSS = objTxa.value;
	var objIfr = document.getElementById(strIFrame);
	var objDoc = (objIfr.contentWindow || objIfr.contentDocument);
	if (objDoc.document) objDoc = objDoc.document;
	
	if (document.selection) {
		var range = document.selection.createRange();
		var stored_range = range.duplicate();
		stored_range.moveToElementText( objTxa );
		stored_range.setEndPoint( 'EndToEnd', range );
		objTxa.selectionStart = stored_range.text.length - range.text.length;
		objTxa.selectionEnd = objTxa.selectionStart + range.text.length;
	}
	
	if (objTxa.selectionStart) {
		var intEnd = strCSS.length;
		var intStart = -1;
		
		if(!showAll) {
		    intEnd = -1;
    		countback:
    		for (var i=(objTxa.selectionStart-1); i > -1; i--) {
    			if (strCSS.charAt(i) == '{') {
    				intStart = i;
    				if (intEnd > -1) {break;}
    			}
    			if (strCSS.charAt(i) == '}') {
    				intEnd = i;
    				break;
    			}
    		}
    	    for (var i=intEnd + 1; i < strCSS.length; i++) {
    			if (strCSS.charAt(i) == '}') {
    				intStart = intEnd + 1;
    				intEnd = i + 1;
    				break;
    			}
    		}
	    }
		strCSS = strCSS.substring(intStart, intEnd);
	}
	with (objDoc) {
		try {
            getElementById('stlMain').innerHTML = strCSS;
			var objRuleColl = styleSheets[0].rules;
			if (!objRuleColl) { objRuleColl = styleSheets[0].cssRules; }

		    
		    var stlDiv = getElementById('stlDiv');
		    stlDiv.innerHTML = '';
		    
		    //Add rules
		    for (var r=0; r<objRuleColl.length; r++) {
				var objRule = objRuleColl[r];		
				stlDiv.innerHTML += '<div style="' + objRule.style.cssText.replace('"',"'") + '" title="' + objRule.selectorText + ': ' + objRule.style.cssText.replace('"',"'") + '">' + objRule.selectorText + '</div>';
			}
			styleSheets[0].cssText = '';
		} catch(e) {
			getElementById('stlDiv').innerHTML = 'The Web Browser you are using cannot access style information dynamically or encountered an error. Please try using the latest version of Internet Explorer, Firefox, Safari or Mozilla.';
		}
	}
	return false;
}