//|__________________________________________________________________________________________________
//|   FILE:			includes/publicfunctions.js	
//|   CREATED:		30 May 2004
//|   AUTHOR:		David Jones
//|   COPYRIGHT:	Get Started Australia Pty Ltd
//|   PURPOSE:		houses common javascript functions used on sites and by the editor, 
//|					including form validation, calendar popup, rollover and image swap functions
//|   COMMENTS:	
//|   		
//|   HISTORY:	
//|   	> 
//|__________________________________________________________________________________________________



// validateform(form) function
// validates all forms on the page, displays error message and highlights problem inputs
// fields should have an id attribute formatted id="FriendlyName,Required,DataType"
// for example <input type="text" name="txtBlahBlah" id="Text Box,1,txt">
// data types can be {txt,num,eml, dte}
// field names starting with 'num' will be checked that they're numeric

function validateform(myform) {
	var elementname;						// name attribute
	var elementvalue						// value attribute
	var valid = true;						// becomes false when any error is encountered
	var errData = "";						// names of bad Data fields
	var errReq = "";						// names of missing required fields
	var id, arrid;							// array with contents of form element's id attribute
	var req;								// temp variable for required field check
	var friendly;							// friendly field name string
	var datatype;							// data type, string, eg txt, num, eml, dte
	var strError = "";
	var iTmp1;
	var sTmp1;
	var sTmp2;
	var sTmp3;
	var arremail;

	for (j = 0; j < myform.elements.length; j++) {
		
		elementname = myform.elements[j].name;
		elementvalue = myform.elements[j].value;
		
		req = false;
		friendly = "";
		datatype = "";
		
		// check for an id attribute, and draw out friendly name, etc.
		if (myform.elements[j].id != "") {
			id = myform.elements[j].id;
			arrid = id.split(",")
			friendly = arrid[0];
			if (parseInt(arrid[1])) req = true;
			datatype = arrid[2];
		}

		// reset background colours in case fields were previously highlighted
		myform.elements[j].style.backgroundColor = "";

		// check for invalid data type if type was specified and field is not blank
		// as this will be handled later.
		if ((datatype != "") && !(elementvalue == "")) { 
			if (datatype == "pwd") {
				if (myform.elements["cmdPasswordConfirm"].value != "" ) {
					if(myform.elements["cmdPasswordConfirm"].value != elementvalue){
						valid = false;
						errData += " -  " + friendly + " Passwords do not match.\n";
						myform.elements[j].style.backgroundColor = "#CCCCFF"; 
						myform.elements["cmdPasswordConfirm"].style.backgroundColor = "#CCCCFF";
					}
				}
			}
			if (datatype == "num") {
				elementvalue = elementvalue.replace("$", "");
				elementvalue = elementvalue.replace(",", "");
				if (isNaN(elementvalue)) {
					valid = false;
					errData += " -  " + friendly + " must be numeric.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
			}
			if (datatype == "num+") {
				elementvalue = elementvalue.replace("$", "");
				elementvalue = elementvalue.replace(",", "");
				if (isNaN(elementvalue)) {
					valid = false;
					errData += " -  " + friendly + " must be numeric.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
				else if (parseFloat(elementvalue) <= 0) {
					valid = false;
					errData += " -  " + friendly + " must be a positive number.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
			}
			if (datatype == "int") {
				elementvalue = elementvalue.replace("$", "");
				elementvalue = elementvalue.replace(",", "");
				if (isNaN(elementvalue) || (parseInt(elementvalue) != parseFloat(elementvalue))) {
					valid = false;
					errData += " -  " + friendly + " must be a whole number.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
			}
			if (datatype == "int+") {
				elementvalue = elementvalue.replace("$", "");
				elementvalue = elementvalue.replace(",", "");
				if (isNaN(elementvalue) || (parseInt(elementvalue) != parseFloat(elementvalue))) {
					valid = false;
					errData += " -  " + friendly + " must be a positive whole number.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
				else if (parseFloat(elementvalue) <= 0) {
					valid = false;
					errData += " -  " + friendly + " must be a positive whole number.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
			}
			if (datatype == "dte") {
				if (isNaN(Date.parse(elementvalue))) {
					valid = false;
					errData += " -  " + friendly + " must be a valid date.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
			}
			if (datatype == "eml") {
				// put into an array to enable test for multiple email addresses
				arremail = elementvalue.split(",")
				for (var loop=0; loop < arremail.length; loop++) { 
					// new and improved RegExp
					myRegExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
					if (arremail[loop].search(myRegExp) == -1  && arremail[loop] !='') {
						valid = false;
						errData += " -  " + friendly + " has an invalid e-mail address:'" + arremail[loop] + "'\n";
						if (loop > 0) {
							errData += "    (separate multiple addresses with ',')\n";
						}
						// highlight this problem field
						myform.elements[j].style.backgroundColor = "#CCCCFF"; 
					}
				} 
			}
			if (datatype == "tme") {
  				iTmp1 = elementvalue.indexOf(":") 
  				if (iTmp1 == -1) { 
					valid = false;
					errData += " -  " + friendly + " must be a valid time.\n";
					// highlight this problem field
					myform.elements[j].style.backgroundColor = "#CCCCFF"; 
				}
  				else { 
					sTmp1 = elementvalue.substr(0 , iTmp1) 
					sTmp2 = elementvalue.substr(iTmp1 + 1, 2) 
					sTmp3 = elementvalue.substr(iTmp1 + 4, 2) 
					sTmp4 = elementvalue.substr(iTmp1 + 7)
  				  	if (!((!isNaN(sTmp1)) && (!isNaN(sTmp2)) && (!isNaN(sTmp3)) && (sTmp1>=0) && (sTmp1<24) && (sTmp2>=0) && (sTmp2<60) && (sTmp3>=0) && (sTmp3<60))) {
						valid = false;
						errData += " -  " + friendly + " must be a valid time.\n";
						// highlight this problem field
						myform.elements[j].style.backgroundColor = "#CCCCFF"; 
					}
				} 
			}
		}
		// check for required field being blank
		if (req && (elementvalue == "")) {
			valid = false;
			errReq += " -  " + friendly + " is required.\n";
			// highlight this problem field
			myform.elements[j].style.backgroundColor = "#CCCCFF"; 
		}
	}

	if (!valid) {	// if an error occurred, generate the error report display
		
		strError = "The data in these fields are invalid:\n\n"
		if (errReq != "") strError += errReq;
		if (errData != "") strError += errData;
		strError += "\nThe fields requiring attention have been highlighted.\n";
		
		alert(strError);
	}
	return valid;
}
function confirmdelete() {
	return confirm('Deleting this entry can not be undone. Continue?');
}
function completedelete(myform) {
	// new, bigger and better delete function
	// deletes any files in the form by ticking the 'deletefiles' checkboxes
	// avoids the onsubmit validation problem by using the js submit method
	if (confirm('Deleting this entry can not be undone. Continue?')){
	  for (j = 0; j < myform.elements.length; j++) {
		elementname = myform.elements[j].name;	
		elementname = elementname.toLowerCase();
		if (elementname.indexOf("deletefiles") > 0) {myform.elements[j].checked = true}
	  }
		SetElementValue(myform.cmdFormAction,'delete');
		myform.submit();
		return false;
    } else {
		return false;
	}
}
function confirmcustom(action) {
	return confirm('You are about to '+action+'\n\n Are you sure you want to continue?');
}
function confirmisimage(filename) {
	if (filename=="") {
		// if there is no file to upload, then return true
		return true;
	}
	extension = filename.substring(filename.lastIndexOf("\\") + 1, filename.length);
	extension = extension.substring(extension.lastIndexOf(".")+1, 50);
	extension = extension.toLowerCase();
	if (extension!="jpg" & extension!="jpeg" & extension!="gif" & extension!="png") {
		alert ("Error: the file that you are uploading does not \nappear to be an image (jpg, gif or png)");
		return false;
	}
}
function ConfirmZipUpload(filename) {
	if (filename=="") {
		// if there is no file to upload, then return true
		return false;
	}
	extension = filename.substring(filename.lastIndexOf("\\") + 1, filename.length);
	extension = extension.substring(extension.lastIndexOf(".")+1, 50);
	extension = extension.toLowerCase();
	if (extension!="zip") {
		alert ("Error: the file that you are uploading does not appear to be a 'zip' file.");
		return false;
	} else {
		return confirm("This function will now upload and unzip the file.\nThis operation cannot be undone.\nAre you sure you want to proceed?");
	}
}
function InStr(strSearch, strSearchFor){
	for (i=0; i < Len(strSearch); i++){
	    if (strSearchFor == Mid(strSearch, i, Len(strSearchFor))){
			return i;
	    }
	}
	return -1;
}

function Mid(str, start, len){
	if (start < 0 || len < 0) return "";
	var iEnd, iLen = String(str).length;
	if (start + len > iLen)
			iEnd = iLen;
	else
			iEnd = start + len;
	return String(str).substring(start,iEnd);
}

function Len(str){  
	return String(str).length;  
}
function Left(str, n)
{
	if (n <= 0)     // Invalid bound, return blank string
			return "";
	else if (n > String(str).length)   // Invalid bound, return
			return str;                // entire string
	else // Valid bound, return appropriate substring
			return String(str).substring(0,n);
}
function Right(str, n)
{
	if (n <= 0)     // Invalid bound, return blank string
	   return "";
	else if (n > String(str).length)   // Invalid bound, return
	   return str;                     // entire string
	else { // Valid bound, return appropriate substring
	   var iLen = String(str).length;
	   return String(str).substring(iLen, iLen - n);
	}
}
function calcCharLeft(s, t, v) {
	// "s" is the source field, "t" is the target div, "v" is value of the allowed field length

		supportsKeys = true;
		maxLength = v;
        if (s.value.length > maxLength) { 
	        s.value = s.value.substring(0,maxLength)
		    charleft = 0;
        } else {
			charleft = maxLength - s.value.length;
		}
		document.getElementById(t).innerHTML="<sub><i>"+charleft+" characters left</i></sub>";
}

function SetElementValue(elt,val){
      //manually overrides a form element value.  elt is the element name, val is new value
      elt.value = val
}

function SetMultiElementValue(myForm,myList) {
	// takes the name of a form and a list of elements & new values to be set within it
	// eg SetMultiElementValue(this.form,'txtName=Andrew,txtMobile=0439 881 392');
	
	var arrPairs = myList.split("|");
	var arrTemp;
	var myElement;
	var myValue;

	for (i = 0; i < arrPairs.length; i++) {
		arrTemp = arrPairs[i].split("=");
		myElement = arrTemp[0];
		myValue = arrTemp[1];
		myElement = eval("myForm." + myElement);
		myElement.value = myValue;
	}
}

function OpenEditor(form, fieldname, stylesheet, imgbehaviour, setting, imagesrc) {
	openBrWindow('/includes/rte/rte_popup.asp?stylesheet='+stylesheet+'&img='+imgbehaviour+'&setting='+setting+'&imgsrc='+imagesrc+'&fldname=document.'+ form.name + '.'+fieldname, 'rte_fullscreen', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=700,height=500');
	return false;
}
function OpenSourceEditor(filename) {
	openBrWindow('/editor/appadmin/codeedit.asp?fn='+filename, 'codeeditpopup', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=650,height=500');
	return false;
}

function OpenPreviewPopup(fileref,windowname) {
	if (windowname != "")
	{
		openBrWindow(fileref, windowname, 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=1,resizable=no,width=800,height=500');
	}
	else {
		openBrWindow(fileref, 'previewpopup', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=1,resizable=no,width=800,height=500');
	}
	return false;
}

// selectdate takes a reference to the form in which an element sits, and the name of the target field
// NB: this function always returns false, so for image inputs, you can put onclick="return selectdate(...);"
function selectdate(form, fieldname) {
	querystring = "?field=document." + form.name + "." + fieldname;
	myfield = eval(form.name + "." + fieldname);
	// sometimes we have two fields with the same name to separately edit the date and time
	// in this case we select the first one to work with
	if (myfield.length) myfield = myfield[0]
	if (myfield.value != "") {
		var myDate = new Date(myfield.value)
		querystring += "&d=" + myDate.getDate() + "&m=" + (myDate.getMonth() + 1) + "&y=" + myDate.getFullYear()
	}
	window_popup = window.open('/includes/calendar.asp' + querystring, 'selectdate', 'width=210,height=203');
	window_popup.focus();
	return false;
}

function openBrWindow(theURL,winName,features) { //v2.0
	winName = window.open(theURL,winName,features);
	winName.focus()
}

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_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_findObj(n, d) { //v4.0
  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 && document.getElementById) x=document.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];}
}

function switchEnablePlain(myform) { 
	if (myform.bitLayout_Plain.checked) {
		myform.bitLayout_ImageAssets.checked = false;
		myform.bitLayout_FileAssets.checked = false;
		myform.bitLayout_LinkAssets.checked = false;
		myform.bitLayout_RSSAssets.checked = false;
		myform.bitLayout_ProductAssets.checked = false;
		myform.bitLayout_ContactForm.checked = false;
		myform.bitLayout_LoginForm.checked = false;
		myform.bitLayout_Sitemap.checked = false;
		myform.bitLayout_SubscriptionForm.checked = false;
		myform.bitLayout_ImageAssets.disabled = true;
		myform.bitLayout_FileAssets.disabled = true;
		myform.bitLayout_LinkAssets.disabled = true;
		myform.bitLayout_RSSAssets.disabled = true;
		myform.bitLayout_ProductAssets.disabled = true;
		myform.bitLayout_ContactForm.disabled = true;
		myform.bitLayout_LoginForm.disabled = true;
		myform.bitLayout_Sitemap.disabled = true;
		myform.bitLayout_SubscriptionForm.disabled = true;
	}
	else if ((myform.bitLayout_ImageAssets.checked) || (myform.bitLayout_FileAssets.checked) || (myform.bitLayout_LinkAssets.checked) || (myform.bitLayout_RSSAssets.checked) || (myform.bitLayout_ProductAssets.checked) || (myform.bitLayout_SubscriptionForm.checked) || (myform.bitLayout_LoginForm.checked) || (myform.bitLayout_ContactForm.checked) || (myform.bitLayout_Sitemap.checked)) {
		myform.bitLayout_Plain.checked = false;
		myform.bitLayout_Plain.disabled = true;
	}
	else if (!(myform.bitLayout_Plain.checked) && !(myform.bitLayout_Plain.disabled)) {
		myform.bitLayout_ImageAssets.disabled = false;
		myform.bitLayout_FileAssets.disabled = false;
		myform.bitLayout_LinkAssets.disabled = false;
		myform.bitLayout_RSSAssets.disabled = false;
		myform.bitLayout_ProductAssets.disabled = false;
		myform.bitLayout_ContactForm.disabled = false;
		myform.bitLayout_LoginForm.disabled = false;
		myform.bitLayout_SubscriptionForm.disabled = false;
		myform.bitLayout_Sitemap.disabled = false;
	}
	else {
		myform.bitLayout_Plain.disabled = false;
	}
}

function switchEnableOneColumn(myform) { 
	if (myform.bitLayout_OneColumn.checked) {
		myform.bitLayout_LeftColumn.checked = false;
		myform.bitLayout_RightColumn.checked = false;
		myform.bitLayout_LeftColumn.disabled = true;
		myform.bitLayout_RightColumn.disabled = true;
	}
	else if ((myform.bitLayout_LeftColumn.checked) || (myform.bitLayout_RightColumn.checked)) {
		myform.bitLayout_OneColumn.checked = false;
		myform.bitLayout_OneColumn.disabled = true;
	}
	else if (!(myform.bitLayout_OneColumn.checked) && !(myform.bitLayout_OneColumn.disabled)) {
		myform.bitLayout_LeftColumn.disabled = false;
		myform.bitLayout_RightColumn.disabled = false;
	}
	else {
		myform.bitLayout_OneColumn.disabled = false;
	}
}

