/* 
	Scripts to update html content		
*/

// G E T  F U N C T I O N S
// Builds the form params for the url for the request

var onloadgethtmlupdate = false;
var gethtmlupdateTarget, gethtmlupdateDebug;
var doHtmlUpdate = 1;
var gethtmlupdateMethod = "POST";

function gethtmlupdate(type,element,objectname,sid) {
	// onhtmlupdate is the name of a function that should run after the gethtmlupdate() is finished.
	// Just apply the name (without the brackets). The function will be called with no arguments.
	// The rendered call could look like this:
	// gethtmlupdate('htmlselect',this.value,'kommuneselect','555291506586444431360114321857867.0','onchange','getupdateprep','onhtmlupdate','getupdateprep');
	args = gethtmlupdate.arguments;
	object 		= objectname;
	curl = url 	+ "/get-"			+ type 
				+ "/" + element.name + "-" 			+ element.value
				+ "/object-" 		+ objectname
				+ "/_sid-" 			+ sid;
	onhtmlupdate = ''
	if (args.length > 4) for (i=4;i<args.length;i+=2) { 
		if (args[i] == 'onhtmlupdate') onhtmlupdate = args[i+1];
		else curl += '/'+args[i]+'-'+args[i+1];
		}
	doHtmlUpdate = 1;
	curl = encodeURI(curl);
	requestArticle(curl);
	}

function getform2htmlpageSetdata(url) {

	var fObj,separator,args=getform2htmlpageSetdata.arguments;
	objectname = false;
	if(args.length>1) fObj=args[1];
	if(args.length>2) {
		objectname=args[2];
		object = findobject(objectname);
		}
	onhtmlupdate = '';
	separator = url.indexOf('//');
	curl = url + '/';
	if (separator<0) separator = curl.indexOf('/-/');
	if (separator>-1) {
		urlPath = curl.substring(0,separator);
		if (urlPath.substring(separator-4,separator)=='.xml') urlPath = urlPath.substring(0,separator-4);
		curl = urlPath + curl.substring(separator,curl.length);
		}
	else if (curl.substring(curl.length-4,curl.length)=='.xml') curl = curl.substring(curl.length,curl.length-4);
	var re=new RegExp('/',"g");
	if (fObj&&fObj.elements) for (n=0;n<fObj.elements.length;n++) {
		if (((fObj.elements[n].type=='checkbox')&&(fObj.elements[n].checked))||(fObj.elements[n].type!='checkbox')) {
			if (((fObj.elements[n].type=='radio')&&(fObj.elements[n].checked))||(fObj.elements[n].type!='radio')) {
				curl += '/' + fObj.elements[n].name + '-' + fObj.elements[n].value.replace(re,"%2F");
		}}}
	else if (fObj&&typeof(fObj)=='object') for (k in fObj) {
		if (typeof(fObj[k])=='object') for (i in fObj[k]) curl += ('/' + k + '-' + fObj[k][i])
		else curl += ('/' + k + '-' + fObj[k]);
		}
	doHtmlUpdate = objectname;
	curl = encodeURI(curl);
	//alert(curl);
	requestArticle(curl);
	return false;
	}

function getform2htmlpageRemoveSuffix(url,suffix) {
	suffix += (suffix.charAt(0)!='.')?'.':'';
	striplen = url.length-suffix.length
	if (url.substring(striplen)==suffix) url = url.substring(0,striplen);
	return url;
	}
function getform2htmlpageConvertUrlFormData(url) {
	/*
		Rewrite xpyth form syntax:
	 	/kost/lon/beregn/basis/_m/salary/-/calculatesalary/gethtmlupdate
	 	to
		/kost/lon/beregn/basis/_m/salary?calculatesalary=1&gethtmlupdate=1
	*/

	var urlParams, url, upElement
	var params = new Array()
	var protocol = null;
	protocolidentifier = url.indexOf('://');
	if (protocolidentifier>-1) {
		protocol = url.substring(0,protocolidentifier);
		url = url.substring(protocolidentifier+3);
		}
	
	url = url.replace('/-/','//');
	separator = url.indexOf('//');
	if (separator>-1) {
		// We have form data in the url
		urlParams = url.substring(separator+2).replace('//','/')
		url = url.substring(0,separator);
		up = urlParams.split('/');
		for (i in up) {
			if (typeof(up[i])=='string') {
				upElement = (up[i].indexOf('-')>-1)?up[i].replace('-','='):up[i]+'=1';
				params.push(upElement);
				}
			}
		}
	url = getform2htmlpageRemoveSuffix(url,'xml');
	if (protocol) url=protocol+'://'+url;
	return [url, params]
	}

function getform2htmldownload(url, objectname) {
	object = findobject(objectname);
	doHtmlUpdate = objectname
	requestArticle(url,[]);
	return false;
	}
function getform2htmlpageupdate(url,objectname) {
	/*
	Function arguments: objectname,url - and optional: fObj,whileupdatetext,whileupdatetextDivClass.
	
	This function converts all elements of the form object fObj to xpyth style url params.
	If the argument 'whileupdatetext' is given, it is shown (briefly) while waiting for the html update.
	If the argument 'whileupdatetextDivClass' is given i.e. class name, this styling is used for the 'waiting text'.
	*/

	var fObj,whileupdatetext,whileupdatetextDivClass,separator,args=getform2htmlpageupdate.arguments;
	if(args.length>2) fObj=args[2];
	if(args.length>3) whileupdatetext=args[3];
	if(args.length>4) whileupdatetextDivClass=args[4];
	if(args.length>5) onhtmlupdate=args[5];
	else onhtmlupdate = '';
	if (objectname)	object = findobject(objectname);
	
	urlParts = getform2htmlpageConvertUrlFormData(url);
	urlPath = urlParts[0];
	urlParams = urlParts[1];
	urlParams.push("get=htmlpage");
	if (objectname) urlParams.push("object=" + objectname);
	
	var re=new RegExp('/',"g");
	if (fObj&&fObj.elements) for (n=0;n<fObj.elements.length;n++) {
		if (fObj.elements[n].multiple) { 
			for (m in fObj.elements[n]) if (m<fObj.elements[n].length&&fObj.elements[n][m].nodeName) { 
				if (fObj.elements[n][m].selected) urlParams.push(fObj.elements[n].name + '=' + fObj.elements[n][m].value);
				}
			}
		else if (((fObj.elements[n].type=='checkbox')&&(fObj.elements[n].checked))||(fObj.elements[n].type!='checkbox')) {
			if (((fObj.elements[n].type=='radio')&&(fObj.elements[n].checked))||(fObj.elements[n].type!='radio')) {
				urlParams.push(fObj.elements[n].name + '=' + fObj.elements[n].value);
		}}}
	else if (fObj&&typeof(fObj)=='object') for (k in fObj) {
		if (typeof(fObj[k])=='object') {
			for (i in fObj[k]) {
				if (typeof(fObj[k][i])!='function') urlParams.push(k + '=' + fObj[k][i]);
				}
			}
		else urlParams.push(k + '=' + fObj[k]);
		}
	if (typeof(_sid)!='undefined') urlParams.push('_sid='+_sid);
	if (whileupdatetextDivClass) whileupdatetexthtml= '<div class="' + whileupdatetextDivClass + '">' + whileupdatetext + '</div>';
	else {
		whileupdatetexthtml = '<div class="note" style="letter-spacing:1em;font-size:10pt;font-variant:small-caps;font-weight:normal">' + whileupdatetext + '';
		whileupdatetexthtml += '<br/><img src="/_root/_lib2/images/icons/spinner/timer2_40.gif" width="36"/></div>';
		}
	if (whileupdatetext) object.innerHTML = whileupdatetexthtml;
	doHtmlUpdate = objectname;
	gethtmlupdateTarget = objectname;
	//curl = encodeURI(curl);
	//alert(curl);
	//alert(onhtmlupdate);
	//alert(urlPath+urlParams)
	requestArticle(urlPath,urlParams);
	return false;
	}

// H T M L U P D A T E  F U N C T I O N S

function GetXmlHttpObject() {

	 // Firefox, Opera 8.0+, Safari
	try { return new XMLHttpRequest(); }
	catch (e){}

	// Internet Explorer
	try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
	catch (e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP.3.0");}
	catch (e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP");}
	catch (e) {}
	try { return xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }
	catch (e) {}
	return null;
	}

function requestArticle() {
	args = requestArticle.arguments;
	url = encodeURI(args[0]);
	if (args.length>1) {
		params = encodeURI(args[1].join('&'));
		if (typeof(gethtmlupdateMethod!='undefined')) {
			if (gethtmlupdateMethod=='GET') {
				if(params) url+=(url.indexOf('?')<0)?'?'+params:'&'+params;
				//url+=params;
				//if (params) url = url + '?' + params;
				//if (typeof(gethtmlupdateDebug!='undefined') && gethtmlupdateDebug==true) alert(url);
				params = null;
				}
			}
		}
	else params = null
	//alert(url)
	req = GetXmlHttpObject();
	if (!req) req = new activeXObject('Microsoft.XMLHTTP'); 
	if (req) {
		req.onreadystatechange = checkRequestResponse;
		req.open(gethtmlupdateMethod, url, true);
		req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
		req.send(params);
		}
	}

function checkRequestResponse() {
	if ((req.readyState == 4)&&(doHtmlUpdate)) {
		response = req.responseText;
		processRawHTML(response);
		}
	}

function processRawHTML(input, getoutput) {
	var start = '';
	var end = '';
	startstring = '<!--gethtmlupdatestart-->';
	resultsIndex = input.indexOf(startstring);
	if (resultsIndex > -1) {
		start = resultsIndex + startstring.length;
		end = input.indexOf("<!--gethtmlupdateend-->");
		}
	else {
		startstring = '<!-- gethtmlupdatestart -->';
		resultsIndex = input.indexOf(startstring);
		if (resultsIndex > -1) {
			start = resultsIndex + startstring.length;
			end = input.indexOf("<!-- gethtmlupdateend -->");
			}	
	}
	output = input.substring(start, end);
	//ConsoleLog(['gethtmlupdate.js processRawHTML -> output html:',output]);
	if (getoutput) return output;
	else {
		//alert(start + ' ' + end + ' ' + output + ' ' + input);
		iobj = findobject(object);
		if (iobj) {
			if (output) {
				if ((iobj.type=='text')||(iobj.type=='textarea')) iobj.value = output;
				else iobj.innerHTML = output;
				}
			else {
				// output for debugging
				iobj.innerHTML = input;
				}
			oHUDate();
			}
		}
	}
function oHUDate() {
	if (onhtmlupdate) {
		temp = onhtmlupdate.split(';');
		onhtmlupdate = temp.join('');
		eval(onhtmlupdate + '()');
		}
	}

