/* AJAX related */

DEBUG=true;

function getXhr(){
     var xhr = null; 
	 if(window.XMLHttpRequest) {
	      xhr = new XMLHttpRequest(); 
	  }
	  else if(window.ActiveXObject) { 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else {  
		alert("XMLHTTPRequest not supported..."); 
		xhr = false; 
	} 
	return xhr;
}
//get the response from the server and display errors, 
//success or redirect to a new page
function handleResponse (errorList,formSending,targetDiv) {
			//erase the loading view if any
			if(document.getElementById('loading')) {
				document.getElementById('loading').style.display="none";
			}
			//check the response from the server
			//if start with Errors::, assume error

			//debugConsole('ServerSubmitResponse',errorList);

			if(errorList.indexOf("Errors::",0)>=0) {
				var displayed=getElementsByClassName(document, "div", "error");
				//hide all the divs that aren't in the error list
				for (var count=0; count<displayed.length; count++) {
					var str=displayed[count].id;
					if(!str.match(errorList)) {
						document.getElementById(displayed[count].id).style.display='none';
					}
				}
				//split the error list and display the errors
				list = errorList.split('Errors::');
				list = list[1].split(',');
				for (var count=0; count<list.length; count++) {			
					new Effect.Appear(document.getElementById('error_'+list[count]));
				}	
				return false;
			}

			//if there is no error and no redirect link, we hide the displayed errors if any
			if(!formSending) {
				var displayed=getElementsByClassName(document, "div", "error");
				for (var count=0; count<displayed.length; count++) {
					var str=displayed[count].id;
						if(!str.match(errorList)) {
							document.getElementById(displayed[count].id).style.display='none';
						}
				}
				//if there is no target div, assign successful
			//debugConsole('BeforeResponse',1);
			handleSuccess(targetDiv,errorList);

			//debugConsole('AftertResponse',2);

				return;
			}
			//if there's no error and a redirect link,redirect
			else if (formSending.match('/')) {
				window.location=formSending;
				return;
			}
			//we should never arrive here...
			document.forms[0].submit();
			return;
}
function handleRequest (xhr,formSending,targetDiv) {
	xhr.onreadystatechange = function(){
		//display the loading, if any
		if(document.getElementById('loading')){
			var loading=document.getElementById('loading');
			loading.style.display = 'block';
		}
		//get response from the server and delegate 
		if(xhr.readyState == 4 && xhr.status == 200){
				var errorList = xhr.responseText;
				handleResponse(errorList,formSending,targetDiv);	
		}
	}
}
//find all the forms and return the request string to the server
function getFormRequestStr(formNb) {
		var currentForm=forms[formNb];
	    return createRequestString(formNb); 
}
//create the request string for the server for one form
function createRequestString(currentForm) {
	var requestString= '';
	var RadioName=[];
	var RadioObj={};
 	inputs = currentForm.getElementsByTagName("input");
	for (var inputNumber = 0; inputNumber < inputs.length; inputNumber++) {
		if (inputs[inputNumber].type == "text" || inputs[inputNumber].type == "hidden" ||
			inputs[inputNumber].type == "password") {
			requestString += _encodeURIComponent(inputs[inputNumber].name) + "=" + _encodeURIComponent(inputs[inputNumber].value) + "&";
		}
		if (inputs[inputNumber].type == "radio" || inputs[inputNumber].type == "checkbox") {
			if(inputs[inputNumber].checked) {
				requestString += _encodeURIComponent(inputs[inputNumber].name) + "=" + _encodeURIComponent(inputs[inputNumber].value) + "&";
			}
		}		
	}
	//collect all selects
	var selects;
 	selects = currentForm.getElementsByTagName("select");
	for (var selectNumber = 0; selectNumber < selects.length; selectNumber++) {
		requestString += _encodeURIComponent(selects[selectNumber].name) + "=" + _encodeURIComponent(selects[selectNumber].value) + "&";
	}
	//collect all textareas
	var textareas;
 	textareas = currentForm.getElementsByTagName("textarea");
	for (var textareaNumber = 0; textareaNumber < textareas.length; textareaNumber++) {
		requestString += _encodeURIComponent(textareas[textareaNumber].name) + "=" + _encodeURIComponent(textareas[textareaNumber].value) + "&";
	}
	requestStr=requestString+"ajax=true";
	return requestStr;
}

function AJSubmit(formNb,formSending,targetDiv) {

	var eleDiv = document.getElementById(formNb);
	eleForms = eleDiv.getElementsByTagName("form");
	//debugConsole ('FormAction',eleForms[0].action);
	var xhr = getXhr();
	xhr.open("POST",eleForms[0].action,true);
	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

	//debugConsole ('sentVariables',getFormRequestStr(eleForms[0]));
	xhr.send(getFormRequestStr(eleForms[0]));
 	handleRequest(xhr,formSending,targetDiv);
}

/*queryPath : string, the page to call 
  success : object, the name of divs and effects to use to insert data
  params : object, parameters and value to be sent to the page to call (POST only)
*/

function remote_function (queryPath,success,params) {
		var loader=false;
		var xhr = getXhr();
		xhr.onreadystatechange = function(){

				if(!loader && document.getElementById('loading')) {
					var loading=document.getElementById('loading');
					loading.style.display = 'block';
					loader=true;
				}

			if(xhr.readyState == 4 && xhr.status == 200){

					if(loader) {
						document.getElementById('loading').style.display="none";
					}
					var response=xhr.responseText;

					//debugConsole ('remoteFunctionCall',response);

					if(response.indexOf('errors::',0)==-1) {
					for (var i=0; i < success.length; i++) {
						for (var arrayOfAction in success[i]) {
							for (var j=0; j < success[i][arrayOfAction].length; j++) {

								if(success[i][arrayOfAction][j]=='response') {
									document.getElementById(arrayOfAction).innerHTML = response;
									continue;
								} 
								if(success[i][arrayOfAction][j].indexOf('function',0)>=0) {
									func = eval(success[i][arrayOfAction][j]);
									func();
									continue;
								} 
								eval("new Effect."+success[i][arrayOfAction][j]+"(document.getElementById(arrayOfAction))");
							}
						}
					}
					}
					else {
						response=response.split('errors::');
						for(k=1; k<response.length; k++) {
						new Effect.Appear(document.getElementById('error_'+response[k]));
						}
					}
			}	
		}
		sendValue=new Array();
		if(params) { 
			method='POST'; 
			for (var param in params) {
				sendValue.push(_encodeURIComponent(param)+"="+_encodeURIComponent(params[param]));
			}
			sendValue.push('ajax=true');
			sendValue=sendValue.join('&');
		} 
		else { 
			method='GET';
			queryPath=queryPath+'&ajax=true';
			sendValue='null';
		}
		xhr.open(method,queryPath,true);
		if(method=='POST') { 
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		}
		xhr.send(sendValue);
}

function handleSuccess(success,response) {
	firstArray:for (var i=0; i < success.length; i++) {

		firstObject:for (var arrayOfAction in success[i]) {

			secondArray:for (var j=0; j < success[i][arrayOfAction].length; j++) {

				if(success[i][arrayOfAction][j]=='response') {
						document.getElementById(arrayOfAction).innerHTML = response;
						continue;
				} 
				if(success[i][arrayOfAction][j]=='value') {
						document.getElementById(arrayOfAction).value = success[i][arrayOfAction][j+1];
						continue firstObject;
				} 
				if(success[i][arrayOfAction][j]=='insert') {
						document.getElementById(success[i][arrayOfAction][j+1]).value = document.getElementById(arrayOfAction).value;
						continue firstObject;
				} 
				if(success[i][arrayOfAction][j]=='block') {
						document.getElementById(arrayOfAction).style.display ='block';
						continue;
				}
				if(success[i][arrayOfAction][j].indexOf('function',0)>=0) {
						var func=success[i][arrayOfAction][j].split(':');
						var func2 = eval(func);
						var func3=eval(func2[1]);
						func3(response);
						continue;
				} 
				if(document.getElementById(arrayOfAction)) {
					eval("new Effect."+success[i][arrayOfAction][j]+"(document.getElementById(arrayOfAction))");
				}
			}
		}
	}
	return;
}

//ASYNCHRONE UPLOAD BAR--------
var uploadState=0;
function AJUpload(el,arrayOfIds,callback) {
		if(uploadState==1) {
			alert('アップロード中');
			return;
		}
		el.target='upload_frame';
		el.submit();
		document.getElementById('upload_frame').style.width='0px';
		getActualSize(arrayOfIds,callback);
}
count=0;
function getActualSize (arrayOfIds,callback) {
		uploadState=1;
		x = getXhr();
		x.onreadystatechange = function(){
			if(x.readyState == 4 && x.status == 200){
				++count;
				var oJSON=eval("("+x.responseText+")");
				//if(DEBUG) {
					//debugConsole('AJUpload',x.responseText);
				//}
				if(oJSON.percent=='0%') {
					var bar=$('progress_bar');
					var bar2=$('progress_state');
					new Effect.Appear(bar);
					new Effect.Appear(bar2);				
				}
				if(oJSON.percent!='100%' || oJSON.fullsize!='downloaded') {
					$('progress_state').innerHTML=oJSON.filesize +'/'+ oJSON.fullsize +' downloaded '+ oJSON.percent;
					$('progress').style.width=oJSON.percent;
					getActualSize(arrayOfIds,callback);
				} 
				else if(oJSON.fullsize=='downloaded' || oJSON.percent!='100%') {
					uploadState=0;
					new Effect.Fade($('progress_bar'));
					$('progress_state').innerHTML='アップロード完了';
					$('progress').style.width='0px';
					new Effect.Fade($('progress_state'));
					uploadCallback(oJSON);
					var func = eval(callback);
					func();
					func='';
					oJSON='';
				}
			}
		}
		var Str=new Array();
		for (var j=0; j < arrayOfIds.length; j++) {
			Str.push(arrayOfIds[j].name+'='+arrayOfIds[j].value);					
		}
		Str=Str.join('&');
		var r=Math.floor(Math.random()*101);
		x.open('GET','/cgi-bin/progress_bar.cgi?'+Str+'&rand='+r,true);
		x.send(null);
}



//-----------------------------






















function getInfoFromFlash(params) {

	var oJSON=eval('('+params+')');
	var func=eval(oJSON.action);
	//debugConsole('Action',oJSON.action);
	if(typeof func =="function") {
		func(oJSON);
	}
}

//SEND TO FLASH
function getFlashMovie(movieName) {
	if(window[movieName+'2'] && window[movieName+'2']["sendTextToFlash"]){
		return window[movieName+'2'];
	}
	if(document.getElementById(movieName) && document.getElementById(movieName).sendTextToFlash){
		return document.getElementById(movieName);
	}
	

}
function sendInfoToFlash(evtName,params) {
    getFlashMovie('map').sendTextToFlash(evtName,params);
} 
//-------//


//events from flash
function onSaveMarker(oJSON) {
	$('lg').value=oJSON.longitude;
	$('lt').value=oJSON.latitude;
	$('address_final').value=$('address').value;
	$('save_place_div').style.display='block';
}
function onShowMarker(oJSON) {
	remote_function('/index.php?m=pc&a=do_c_map_entry_comment&entry_id='+oJSON.id,[{map_entry_comment:['response','Appear']}])
}
function onCloseMarker(oJSON) {
	new Effect.Fade($('map_entry_comment'));
}
function onAddComment(oJSON) {
	$('entry_id_add_comment').value=oJSON.id;
	$('save_comment_form').style.display="block";
    getFlashMovie('map').sendTextToFlash('onComment',1);
}
function onDisplaySearch(oJSON) {
	$('kabeuchi_map_add_form').style.display="block";
}

function onDisplayHelp(oJSON) {
	$('map_help_'+oJSON.id).style.display="block";
}


function onAddMedia(oJSON) {
	//debugConsole ('onAddMedia',oJSON.id);
	document.getElementById('entry_id_add_media').value=oJSON.id;
	document.getElementById('insert_map_add_media').style.display="block";
	document.getElementById('entry_id_add_media_vid').value=oJSON.id;
}
//


//events to flash
function onCancel(divId,evtName,State) {
	$(divId).style.display='none';
	getFlashMovie('map').sendTextToFlash(evtName,State);
}


function debugConsole (title,elem) {
		warningDiv = document.createElement("div");
		warningDiv.style.backgroundColor="white";
		warningDiv.style.color="black";
		warningDiv.style.top="0px";
		warning = document.createTextNode(title+':'+elem);
		warningDiv.appendChild(warning);
		document.getElementById('debugPanel').appendChild(warningDiv);
}






/*queryPath : string, the page to call 
  success : object, the name of divs and effects to use to insert data
  params : object, parameters and value to be sent to the page to call (POST only)
*/

function remote_function2 (queryPath,success,params) {
		var loader=false;
		var xhr = getXhr();

		xhr.onreadystatechange = function(){

				if(!loader && document.getElementById('loading')) {
					var loading=document.getElementById('loading');
					loading.style.display = 'block';
					loader=true;
				}

			if(xhr.readyState == 4 && xhr.status == 200){

					if(loader) {
						document.getElementById('loading').style.display="none";
					}
					var response=xhr.responseText;

					if(response.indexOf('errors::',0)==-1) {

						handleSuccess(success,response);
					}
					else {
						response=response.split('errors::');
						for(k=1; k<response.length; k++) {
						new Effect.Appear(document.getElementById('error_'+response[k]));
						}
					}
			}	
		}
		sendValue=new Array();
		if(params) { 
			method='POST'; 
			for (var param in params) {
				sendValue.push(_encodeURIComponent(param)+"="+_encodeURIComponent(params[param]));
			}
			sendValue.push('ajax=true');
			sendValue=sendValue.join('&');
		} 
		else { 
			method='GET';
			queryPath=queryPath+'&ajax=true';
			sendValue='null';
		}
		xhr.open(method,queryPath,true);
		if(method=='POST') { 
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		}
		xhr.send(sendValue);
}











