//Javascript - common functions for web page editing date editing, setup editing
function changeFinishText(anythingDirtyValue, isWaitingMode){
	if (arguments.length<2){
		var isWaitingMode=false;
	}
	if (isWaitingMode){
		return "PLEASE WAIT..";
	} else {
		if (anythingDirtyValue){
			return "MAKE CHANGES";
		} else {
			return "FINISHED EDITING";
		}
	}
}

function writeInnerHTMLForObjectName(thisObjName,thisText, callingRef){
	var thisObj=gObj(thisObjName);
	//alert("932: thisObjName="+thisObjName+lR()+"id="+thisObj.id+lR()+"callingRef="+callingRef);
	//alert("752 writing innerHTML for callingRef="+callingRef+lR(2)+"thisText:"+lR()+thisText);
	thisObj.innerHTML=thisText;
}
function writeInnerHTML(thisObj,thisText, callingRef){
	//alert("752 writing innerHTML for callingRef="+callingRef+lR(2)+"thisText:"+lR()+thisText);
	thisObj.innerHTML=thisText;
}

function hObj(oName,noWorry,callRef,docObj){
	//like gObj but works on top.headerFrame rather than document
	//alert("930 id="+top.headerFrame.document.getElementById(oName).id);
	var debugForceErrorsButHonourNoworry=false;//set true for 100% flagging
	var objectNameToForcErrors ="sbPriceBasis";//leave blank for no action
	if (oName==objectNameToForcErrors){
		debugForceErrorsButHonourNoworry=true
	}
	if (arguments.length<4){
		var docObj=top.headerFrame;
	}
	if (arguments.length==1){
		var noWorry=false;//if noWorry, then hides alert if unable to assign
	}
	if (debugForceErrorsButHonourNoworry && !noWorry){
		//try the assignment and accept that it will throw error if reference invalid (so that Opera will help track hierarchy of calls)
		return top.headerFrame.document.getElementById (oName);
	}
	if (top.headerFrame.document.getElementById (oName)){
		//used until Operat: return docObj.getElementById (oName);
		return top.headerFrame.document.getElementById (oName);
	} else {
		if (noWorry){
			return false;
			//no action - may legitimately not be defined
		} else {
			var tS="COULD NOT ASSIGN TO"+lR(2)+oName;
			if (arguments.length>2){
				tS+=lR()+"callingRef="+callRef;
			}
			alert(tS);
			if (true){
				fish=chips;//throw error
			} 
			return;
		}
	}
}

function gObj(oName,noWorry,callRef,docObj){
	//al ert("about to look for oName="+oName);
	
	var debugForceErrorsButHonourNoworry=false;//set true for 100% flagging
	var objectNameToForcErrors ="sbPriceBasis";//leave blank for no action
	if (oName==objectNameToForcErrors){
		debugForceErrorsButHonourNoworry=true
	}
	if (arguments.length<4){
		var docObj=document;
	}
	if (arguments.length==1){
		var noWorry=false;//if noWorry, then hides alert if unable to assign
	}
	if (debugForceErrorsButHonourNoworry && !noWorry){
		//try the assignment and accept that it will throw error if reference invalid (so that Opera will help track hierarchy of calls)
		return document.getElementById (oName);
	}
	if (document.getElementById (oName)){
		//used until Operat: return docObj.getElementById (oName);
		return document.getElementById (oName);
	} else {
		if (noWorry){
			return false;
			//no action - may legitimately not be defined
		} else {
			var tS="COULD NOT ASSIGN TO"+lR(2)+oName;
			if (arguments.length>2){
				tS+=lR()+"callingRef="+callRef;
			}
			ajaxLogFromJS("common.js","4765: "+tS);
			alert(tS);
			if (true){
				//throwFatalError(tS)
				fish=chips;//throw error
			} 
			return;
		}
	}
}
function idName(objName){
	return " name='" +objName+"' id='"+objName+"' ";
}
function lR(nRet){//016 adds  Line-Return(s)
	var rC=String.fromCharCode(10);
	var tS = rC;
	if(arguments.length==0){nRet=1}
	while (nRet>1){
		tS += rC;
		nRet = nRet-1;
	}
	return tS;
}

function createXML() {
	var req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }
	return req;
	/*
	if (req) {
		req.onreadystatechange = processReqChange;
		req.open("GET", url, true);
		req.send("");
	}*/
}
function clearLog(){
	//ajaxLogFromJS("[missing]","[CLEAR LOG]",true)
}

function errorLog(pageRef,thisMessage){
	writeLogFromJavascript(1,pageRef,thisMessage,false)
}

function ajaxLogFromJS(pageRef,thisMessage,isClearFlag){
	if (arguments.length<3){
		var isClearFlag = false;
	}
	if (const_sendAjaxLogRequests10==0){
		//alert("4024");
		return;
	}
	//alert("999"+lR()+thisMessage);
	writeLogFromJavascript(0,pageRef,thisMessage,isClearFlag);
}

function writeLogFromJavascript(debug0Error1,pageRef,thisMessage,isClearFlag){
	//var xmlhttp2 =  new XMLHttpRequest();
	//alert("4025");
	var xmlhttp2 =createXML()
	xmlhttp2.open("POST", "ajaxLog.php", true);
	xmlhttp2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	var now = new Date();
	var d = new Date();
	var curr_hour = d.getHours();
	var curr_min = d.getMinutes();

	var curr_sec = d.getSeconds();
	var curr_msec = d.getMilliseconds();

	var timeString=curr_hour + ":" + curr_min + ":" + curr_sec + ":" + curr_msec+":"+ajaxLogSeq;
	if (isClearFlag){
		xmlhttp2.send("clearLog=1");
		ajaxLogSeq=0;
	} else {
		//var messageString=ajaxLogSeq+"("+timeString+"): "+thisMessage
		var stringToSend=timeString+"~"+pageRef+"~"+thisMessage+"~"+debug0Error1;
		//var stringToSend=escape(messageString);//escaping not really needed - was done in debugging NS_ERROR_DOM_INVALID_CHARACTER_ERR which turned out to be createElement issue
		//alert("1690: stringToSend - "+stringToSend);
		xmlhttp2.send("logData="+stringToSend);
		ajaxLogSeq++;
	}
	//alert("4026");
}

function jgSetHTML(objName,newText){
	//alternative to straight innerHTML to avoid resizing-image problem in IE
	
	var thisObj=gObj(objName);
	var origHTM=thisObj.innerHTML;
	var parentNode=thisObj.parentNode;
	var clone1=thisObj.cloneNode(true);
	//alert("about to use jgSetHTML for newText="+newText);
	clone1.innerHTML=newText;
	parentNode.replaceChild(clone1, thisObj);
	//noActionAjaxLog1("693: changing HTML for object named ~"+objName+"~\nFROM "+origHTM+"~\nTO "+clone1.innerHTML);
}
function aV(){
	var tV=0;
	for (var a=0;a<arguments.length;a++){
		tV+= parseInt(parseInt(arguments[a]));
	}
	return tV;
}
function setThisAttribute(node, thisName, thisValue) {
	if ((navigator.appName == 'Microsoft Internet Explorer')||(navigator.appName == 'Microsoft Internet Explorer')){
		for (var i = 0; i < node.attributes.length; i++){
			if (node.attributes[i].name == thisName){
				node.attributes[i].value = thisValue;
				break;
			}
		}
	} else {
		//td.innerHTML =thisRun.cellInnerHTML[a];
		node.setAttribute(thisName,thisValue);
		
	}
}
function d(lineString){
	document.write(upQuote(lineString));
}
function dT(lineString){
	tString+=upQuote(lineString)+"\n";
}
function upQuote(inString,sourceCode){//this is duplication of u0 version????
	//turns single quote to double-quote, and § (alt-0167) to single quote
	var regExp= /'/g;
	var newString=String.fromCharCode(34);
	inString = inString.replace(regExp,newString);
	regExp = /§/g;
	inString = inString.replace(regExp,"'");
	return inString;
}
function throwFatalError(thisMessage){
	if (arguments.length==0){
		var thisMessage="";
	}
	if (thisMessage.length>0){
		alert(thisMessage);
	}
	return abcd/efg;
	//return 1/0;//make a fatal error that will show the call stack in the console
}
function jgMax(){
	//returns maximum of given values
	var maxSoFar=arguments[0]-1;//to make sure value caught first time round
	for (var a=0; a<arguments.length; a++){
		if (arguments[a]>maxSoFar){
			maxSoFar=arguments[a];
		}
	}
	return maxSoFar;
}
function jgMin(){
	//returns minimum of given values
	var minSoFar=arguments[0]+1;//to make sure value caught first time round
	for (var a=0; a<arguments.length; a++){
		if (arguments[a]<minSoFar){
			minSoFar=arguments[a];
		}
	}
	return minSoFar;
}
function downQuote(inText, loseAllQuotes){
	if (arguments.length==1){
		var loseAllQuotes=false;
	}
	var newString=String.fromCharCode(34);//double-quote
	var tS = "" + inText+ "";//force to text
	if (tS==null){
		//al ert("upQuote null from callRef=" + callRef)
		return "";
	}
	if (tS.length==0){
		//al ert("upQuote - inText has zero length for callRef="+callRef);
	} else {
		tS=dQ(tS)
		if (loseAllQuotes){
			var qT=String.fromCharCode(34);
			if ((tS.indexOf(qT)>-1) ||(tS.indexOf("'")>-1)){
				tS=dQ(tS);
			}
		}
		return tS;
	}
	
}
function dQ(inText){
	var tS = inText.replace(/\§/g,"°");
	tS = tS.replace(/\'/g,"§");
	tS = tS.replace(/\"/g,"'");
	return tS;
}
function getPar(parName,parString){
	//Extracts parameter from parString (or location.search string if no parString)
	var failValue=-999;
	var sourceString="";
	if (arguments.length>1){
		sourceString=parString;
	} else {
		sourceString=location.search;
	}
	//alert("4006:getPar called with parameter name = "+parName+lR(1)+"location.search starts as "+location.search);

	var startPos=findPar(parName,sourceString,1);
	//al ert("startPos is "+startPos);
	if (startPos ==-1){return failValue}//not found
	startPos += (parName.length+2) ;//move to next character after "&NAME="
	var rest ="";
	for (var pos=startPos; pos<sourceString.length; pos++){
		var thisChar=sourceString.substr(pos,1);
		if (thisChar=="&"){
		return rest;
		} 
		else{
			rest += thisChar;
		}
	}
	return rest;
}
function findPar(parName,searchString,rType){
	//checks whether parName is a parameter within searchString
	//if rType=0, returns True if found
	//otherwise returns the start position within the string
	var aString="var startPos = searchString.indexOf('&"+parName+"=');";
	eval(aString);
	if (startPos ==-1){
		aString="startPos = searchString.indexOf('?"+parName+"=');";
		eval(aString);
	}
	if (rType==0){
		if (startPos ==-1){
			return false;
		}
		else {
			return true;
		}
	}
	else {
		return startPos;
	}
}
function needleInHaystack(needle,haystack){
	return (haystack.toLowerCase().indexOf( needle.toLowerCase() )>-1);
}

function stringWithoutRepeat(optionalPrefix,mainString){
	//for use with "Photo of " for example - add the prefix if it is not already in the main string
	if (needleInHaystack(optionalPrefix,mainString)){
		return mainString;
	} else {
		return optionalPrefix+mainString;
	}
}
function jsStripSlashes(inString){
	//NB seems not to work on \'  - so cut these out in PHP by removing the escaped-code which is %5C
	var strippedString=inString.replace(/\\/g, "");//remove back-slashes
	var interim=strippedString;
	strippedString=strippedString.replace(/\\/g, "");//strip the stripped string!
	writeLogFromJavascript(0,"common.js","4192:jsStripSlashes - inString="+inString+"  interim="+interim+"  strippedString="+strippedString);
	return strippedString;
}
function jgJoin(thisArray,showIndices,useLR){
	if (arguments.length<2){
		var showIndices=false;
	}
	if (arguments.length<3){
		useLR=false;
	}
	if (useLR){
		var delim = lR();
	}else {
		var delim = "*";
	}
	var tS="";
	/*for each (thisElement in thisArray){
	tS+=thisElement+"*";
	}*/
	for (var a=0; a<thisArray.length; a++){
		if (showIndices){
			tS+="("+a+"):" ;
		}
		tS+=thisArray[a]+delim;
	}
	return tS;
}

/*not yet used, but neat:
function saveURLparameters(){
	if (location.search.length > 0) {
		launchString = location.search.substring(1, location.search.length);
		var launchStringArray = launchString.split("&");
		for (var i = 0; i <= launchStringArray.length - 1; i++) {
			var left = launchStringArray[i].substring(0, launchStringArray[i].indexOf("="));
		var right = launchStringArray[i].substring(launchStringArray[i].indexOf("=") + 1, launchString.length);
		if (isNaN(right)) {
			right = '"' + right + '"';
		}
		eval("var " + left + " = " + right);
	}
} 
*/
function jgUnescape(thisString,callingRef){
	//unescapes text. If still escaped, unescapes that BUT makes error log report
	var uString=unescape(thisString);
	if (uString.indexOf("%20")==-1){
		return uString;
	}
	//if here, still escaped
	uString=unescape(uString);
	errorLog("webEdit.js","4570: The text ~"+uString+"~ was double-escaped. CallingRef="+callingRef)
	return uString;
}
function isNumeric(inCode){
	if (inCode==null) {
		return false;
	}
	if (inCode.length==0){
		return false;
	}
	return !isNaN(inCode);
}
function jgSplit(inString,delimiter){
	//inString=noEndString2(inString,delimiter);
	inString=noEndString(inString,delimiter);
	if (inString.indexOf(delimiter)==-1){
		var tA=new Array();
		if (inString.length>0){
			tA[0]=inString;
		}
	} else {
		tA=inString.split(delimiter);
	}
	return tA;
}
function noEndString(inString,stringToLose,leaveLeft,leaveRight){//015
	if ((inString==null)||(inString.length==0)){
		return "";
	}
	if ((stringToLose==null)||(stringToLose.length==0)){
		return inString;
	}
	if (arguments.length<4){
		var leaveRight=false;
	}
	if (arguments.length<3){
		var leaveLeft=false;
	}
	if (!leaveRight){
		//trim right
		alert("4697: inString="+inString);
		while (inString.substr(inString.length-stringToLose.length,stringToLose.length)==stringToLose){
			inString=inString.substr(0,inString.length-stringToLose.length);
		}
	}
	if (!leaveLeft){
		//trim left
		while (inString.substr(0,stringToLose.length)==stringToLose){
			inString=inString.slice(stringToLose.length);
		}
	}
	return inString;
}
function afterLastInstance(inString,seekString){
	return beforeAfterFirstLastInstance(inString,seekString,false,false);
}
function beforeAfterFirstLastInstance(inString,seekString,isBefore,isFirst){
	tA=splitAtFirstLastInstance(inString,seekString,isFirst);
	if (isBefore){
		return tA[0];
	} else {
		return tA[1];
	}
}
function splitAtFirstLastInstance(inString,seekString,isFirst){
	var tA=["",""];
	if (inString==null){
		return tA;
	}
	var firstPos=inString.indexOf(seekString);
	if (firstPos== -1){
		//if no marker, return whole string as first element
		tS[0]=inString;
		return tA;
	} else {
		if (isFirst){
			var splitPos=firstPos;
		} else {
			var splitPos=inString.lastIndexOf(seekString);
		}
	}
	tA[0]=inString.substr(0,splitPos);
	tA[1]=inString.substr(splitPos+1);//splitPos is the split character itself
	return tA;
}

