/**
 * Luotu: 23.9.2008 Marko Behm
 * Tarvitsee toimiakseen:
 * - ajax-popup.js
 *
 * Käyttö:
 * Form-actioniksi: "javascript: ajaxPOST('formin-id');"
 * Formille action-niminen hiddenfield, johon ajettavan actionin absoluuttinen url
 *
 * Esimerkki:
 * <form method="post" id="form" action="javascript: ajaxPOST('form');">
 *		<input type="hidden" name="action" value="{$www_base}siteshop/admin/shop/new">
 *
 * Muokattu:
 * 20.5.2009: Lisätty automaattinen ajon lopettaja, jos ajo kestää liian kauan.
 * 10.6.2009: Muokattu siten että jokainen postaus on oma instannssi
 * 18.6.2009: Lisätty flagi taustasivun refreshaukselle
 * 31.5.2010: Lisätty json-datan kutsu ja datan siirto callback-functiolla
*/

/** Suorittaa ajax-postauksen käyttäen apunaan ajax-popuppia
@param string form_id Lähetettävän formin id
@param string target Kohde elementin id (Oletuksena popup)
@param string reload Arvolla true taustalla oleva sivu ladataan uudestaan kun popup suljetaan (Oletuksena true) */
function ajaxPOST(form_id){

	if ($(form_id)){
		var action;
	
		if(arguments[1])
			target = arguments[1]; 
		else
			target = undefined;
		
		if(arguments[2] == undefined || arguments[2] == true)
			reload = true;
		else
			reload = false;
		
		// Debuggataan
		if(arguments[3]){
			DisplayFormValues(form_id, target);
			return false;
		}
		
		action = ajaxPOSTcreateUrl(form_id, reload);
	
		if (action){
			loadContent(action, target);
		}
		else
			alert("Virhe!\n\nActionia ei saatu rakennettua.");
	}
	else{
		alert('Antamallasi id:llä ei löytynyt lomaketta. ('+form_id+')');
	}
}

/** Ladataan ulkopuolinen css/js-tiedosto */
function loadObj(file){
	var fileref = "";

	if (file.indexOf(".js") != -1){
		fileref = document.createElement('script');
		fileref.setAttribute("type","text/javascript");
		fileref.setAttribute("src", file+'?'+createRandomValue());
	}
	else if (file.indexOf(".css") != -1){
		fileref = document.createElement("link");
		fileref.setAttribute("rel", "stylesheet");
		fileref.setAttribute("type", "text/css");
		fileref.setAttribute("href", file+'?'+createRandomValue());
	}

	if (fileref != ""){
		document.getElementsByTagName("head").item(0).appendChild(fileref);
	}
}

/* Ladataan content. */
function loadContent(url, target){
	
	if (typeof ME != 'object')
		ME = new Array();
	
	ME[target] = new loader(url, target);
	
	if(arguments[2])
		ME[target].debug = true;
	
	ME[target].startLoading(url, target);
}

/* Ladataan json-dataa */
function loadData(url, callback){
	if (url.indexOf('/-/') < 1){									// Muokataan ajaxille lähtevää requestia. Huomioidaan su3-parametrit
		if (url.charAt(url.length-1) == '/')
			url = url+'-/';
		else
			url = url+'/-/';
	}
	
	callback_params = (arguments[2]) ? arguments[2] : null;
	
	if (url.charAt(url.length-1) != '/')
		url = url+'/';

	url = url+createRandomValue();									// Lisätään urliin dummy-parametri, jotta selaimet eivät onnistu kutsun cacheamisessa

	 var myAjax = new Ajax.Request(url, {
	 	method: 'get',
	 	requestHeaders: {Accept: 'application/json'}, 
	 	onSuccess: function(transport){
	 		if (200 == transport.status)
	 			callback(eval('(' + transport.responseText + ')'), callback_params);
	 	}
	 });
}

/** Asetetaan lataajan tiedot */
function loader(url, target){
	this.id               = target;
	this.debug            = false;
	this.maxExecutionTime = 0;
	this.timer;
	this.action;
	
	this.startLoading      = _startLoading;
	this.showLoading       = _showLoading;
	this.cancelLoading     = _cancelLoading;
	this.removeLoading     = _removeLoading;
	this.createRandomValue = createRandomValue;

	this.random = this.createRandomValue();
}

/* Vahvistetaan latauksen suoritus */
function confirmLoadContent(url,msg){
	if (confirm(msg)){
		
		if(arguments[2])
			target = arguments[2]; 
		else
			target = undefined;
		
		loadContent(url, target);
	}
}

/* Vahvistetaan lomakkeen submittaus */
function confirmSubmit(formname, msg){
	var aForm = document.getElementsByName(formname);
	var form = aForm[0];

	if (confirm(msg) && form.name){
		form.submit();
	}
}

/** Käynnistää latauksen */
function _startLoading(url, target){
	orig_url = url;
	
	if (url.indexOf('/-/') < 1){									// Muokataan ajaxille lähtevää requestia. Huomioidaan su3-parametrit
		if (url.charAt(url.length-1) == '/')
			url = url+'-/';
		else
			url = url+'/-/';
	}

	if (url.charAt(url.length-1) != '/'){
		url = url+'/';
	}
	
	url = url + this.random;										// Lisätään urliin dummy-parametri, jotta selaimet eivät onnistu kutsun cacheamisessa
	this.action = url;

	var aUrl = splitUrl(url);										// Pilkkoo linkin actioniin ja parametreihin
	action = aUrl[0];
	params = aUrl[1]+'&ajax_url='+encodeURIComponent(orig_url);		// Lisätään alkuperäinen kutsu mukaan

	if (target == undefined && $('ajax_popup')){					// Asetetaan oletuksena popup latauksen targetiksi
		target = $('ajax_popup').id;
	}
	
	if (this.debug)
		alert('Alkaa '+this.id);
	
	this.showLoading(target);

	var ajax = new Ajax.Updater(									// Suoritetaan request
		{success: target},
		action,
		{method: 'post', parameters: params, evalScripts: true, onSuccess:function(){this.removeLoading('automaattinen sammutus');}.bind(this)}
	);
}

/** Asettaa läpinäkyvän alueen ja ilmoittaa että sisältöä ladataan. Klikkaus sulkee näkymän. */
function _showLoading(target){
	
	// Katkaistaan sivunlataus jos se kestää liian kauan
	if (this.maxExecutionTime > 0)
		this.timer = setTimeout( function(){ this.cancelLoading( ); }.bind(this), this.maxExecutionTime); 	

	if (target == 'ajax_popup'){
		var loading_overlay = document.createElement('DIV');
		$(target).appendChild(loading_overlay);

		loading_overlay.setAttribute('id','loading_overlay');
		loading_overlay.onclick = function(){removeLoading()};
		new Effect.Appear('loading_overlay', { duration: 0, from: 0.0, to: 0.7 });
		loading_overlay.innerHTML = '';

		var loading_overlay_title = document.createElement('DIV');
		loading_overlay_title.setAttribute('id','loading_overlay_title');
		loading_overlay_title.innerHTML = '<b class="loading">&nbsp; Ladataan...</b>';
		$(target).appendChild(loading_overlay_title);
	}
}

/** Katkaisee sivunlataamisen jos palvelin vastaa liian hitaasti */
function _cancelLoading(){
	alert("VIRHE!\nJärjestelmä vastaa liian hitaasti. \nKoeta myöhemmin uudestaan."+ ((this.debug) ? "\n\n"+this.id : ""));
	this.removeLoading('liian hidas');
}

/** Sulkee ladataan-ilmoituksen. */
function _removeLoading(reason){
	
	window.clearTimeout(this.timer);
	
	if (this.debug)
		alert('Loppuu '+this.id+"\n\n"+reason);
	
	if ($('ajax_popup') && $('loading_overlay'))
		$('ajax_popup').removeChild($('loading_overlay'));
	if ($('ajax_popup') && $('loading_overlay_title'))
		$('ajax_popup').removeChild($('loading_overlay_title'));
}

/** Luo päiväyksestä uniikin arvon, jotta voidaan estää ajaxin cachettuminen */
function createRandomValue(){
	var s = new Date();
	return 'ajaxcache/'+s.getTime();
}

/* Pilkkoo annetun siteupdate-linkin actioniin ja parametreihin */
function splitUrl(action){
	var aUrl = new Array();

	var part1 = action.substr(0,action.indexOf('/-/'));				// Puretaan action takaisin palasiksi
	var part2 = action.substr(action.indexOf('/-/'));

	if (part2.indexOf('/-/') === 0){								// Siivotaan parametrit
		part2 = part2.substr(3);
		var values = new Array();
		var param = '';

		values = part2.split('/');

		for (i=0; i < values.length; i++){

			if (i%2){
				if (i < (values.length-1)){
					param = param + encodeURIComponent(values[i]) + '&';
				}
				else{
					param = param + encodeURIComponent(values[i]);
				}
			}
			else{
				param = param + values[i] + '=';
			}
		}
	}
	aUrl[0] = part1;
	aUrl[1] = param;

	return aUrl;
}

/** Luo annetusta lomakkeesta requestin */
function ajaxPOSTcreateUrl(form_id, refresh){
	var action = '';
	var param = '';
	elem = document.getElementById(form_id).elements;

	for(var i = 0; i < elem.length; i++){
		if (elem[i].type != undefined){
			// Lomakkeen action
			if (elem[i].type == 'hidden' && elem[i].name == 'action' && elem[i].value){
				// Viimeinen merkki ei saa olla kauttaviiva
				var value = elem[i].value;
	
				if (value.charAt(value.length-1) == "/"){
					value = value.substr(0,value.length-1);
				}
	
				action = value;

				// Asetetaan popupille tieto, että suljettaessa päivittää koko koko sivun
				if(refresh == true){
					setReload();
				}
			}
			
			// Muut parametrit
			else{
			//	alert(elem[i].name + ' ja ' + elem[i].type + ' ja ' + elem[i].value);
	
				if ((elem[i].type == 'text' || elem[i].type == 'hidden' || elem[i].type == 'password') && elem[i].value){
					param = param + elem[i].name + '/' + encodeURIComponent(elem[i].value) + '/';
				}
				else if (elem[i].type == 'textarea' && elem[i].value){
					param = param + elem[i].name + '/' + encodeURIComponent(elem[i].value) + '/';
				}
				else if (elem[i].type == 'checkbox' && elem[i].value && elem[i].checked){
					param = param + elem[i].name + '/' + encodeURIComponent(elem[i].value) + '/';
				}
				else if (elem[i].type == 'radio' && elem[i].value && elem[i].checked){
					param = param + elem[i].name + '/' + encodeURIComponent(elem[i].value) + '/';
				}
				else if (elem[i].type == 'select-one' && elem[i].value){
					param = param + elem[i].name + '/' + encodeURIComponent(elem[i].value) + '/';
				}
			}
		}
	}

	if (action && param)
		action = action + '/-/' + param;
	else if (!action)
		action = false;

	return action;
}

/** Tällä voidaan näyttää kaikki lomakkeella olevat elementit */
function DisplayFormValues(form_id, target) {
	str  = '';
	form = $(form_id);
	elem = form.elements;
	
	if (elem.length > 0){
		str = '<table><tr><th>Type</th><th>Name</th><th>Value</th></tr>';
		for(var i = 0; i < elem.length; i++){
			
			if (elem[i].type != undefined){
				bgcolor = '#eeeeee';
				str += '<tr bgcolor="'+bgcolor+'">'
				str += "<td>" + elem[i].type + "</td>";
				str += "<td>" + elem[i].name + "</td>";
				str += "<td>" + elem[i].value + "</td>";
				str += "</tr>";
			}
		}
		str += '</table>'
		document.getElementById(target).innerHTML = str;
	}
	else
		document.getElementById(target).innerHTML = 'Virhe!';
}
