/*  Copyright 2010 by Marco Stocco <http://www.my-w.org>
 * -----------------------------------------------------------
 *
 * The javascript library for the ajax requests
 *
 * This script is distributed under the GNU General Public License.
 *
 * Read the entire license text here: http://www.gnu.org/licenses/gpl.html
 */

myw.ajax = {

	pHistory : new Array(),
	popup_iframe : new Object(),
	iframe_url : '',
	isAjax : 0,
	lines : 0,
	history_step : 1,
	history_isback : 1,
			
	execute : function(_method,_url,_params,_div,_callback,_effectNo) {
		if (_url.indexOf('.htm')==-1) {
			var isLogged = 0;
			if (document.location.href.indexOf('/bin/admin/')>=0 || (document.frm_main && document.frm_main.gh_admin_uid && document.frm_main.gh_admin_uid.value>0))
				isLogged = 1;
			
			if (_method == 'get') {
				_params = _params.replace(/&amp;/g,'&');
				if (isLogged && _params.search(/gh_admin_uid=\d+/) == -1)
					_params += myw.globalHereditableParams;
					
				_params += '&nh_isAjaxRequest=1';
				
				/* getTimeId to load the page from internet and from cache */
				if (_params.search(/nh_noCache=1/) != -1 || isLogged)
					_params += '&nh_timeId='+myw.getTimeId();
			} else if (_method == 'post') {
				_params.nh_isAjaxRequest = 1;
				
				if (isLogged && !_params.gh_admin_uid) {
					var A = myw.globalHereditableParams.split('&');
					for(var i=0;i<A.length;i++) {
						var B = A[i].split('=');
						if (!_params[B[0]]) 
							_params[B[0]] = B[1];
					}
				}
				
				if (_params.nh_noCache==1 || isLogged)
					_params.nh_timeId=myw.getTimeId();
			}
		}
		
		var vars = new Object();
		vars.method = _method;
		vars.url = _url;
		vars.params = _params;
		vars.div = _div;
		vars.callback = _callback;
		vars.effectNo = _effectNo;
				
		/* put the unit content in a absolute layer */
		if (_div.indexOf('popup')==0) {
			if (_div.search(/:/)>0 && _div.search(/x/i)>0) {
				var C = _div.split(':');
				var P = C[1].split('x');
				
				_div = 'myLayer_content';

				_params += '&gh_isPopupLayer=1&nh_startNewWin=1';
				myw.ajax.history_step = 1;
				myw.ajax.history_isback = 1;
				myw.ajax.popup_iframe = document.createElement("iframe");
				myw.ajax.popup_iframe.id = 'myLayer_content_iframe';
				myw.ajax.popup_iframe.name = 'myLayer_content_iframe';
				myw.ajax.popup_iframe.className = 'myLayer_content_iframe';
				myw.ajax.popup_iframe.frameBorder = 0;
				myw.ajax.popup_iframe.style.width = P[0]+'px';
				myw.ajax.popup_iframe.style.height = P[1]+'px';
				_params = _params.replace(/nh_isAjaxRequest=\d/g,'');
				_params = _params.replace(/getUnit=\w+/,'');
				_params = _params.replace(/getUnitFragment=\d+/,'');
				_url.search(/\.htm/)==-1 ?
					myw.ajax.iframe_url = _url + '?' + _params :
					myw.ajax.iframe_url = _url;
					
				/* avoid animate({height:'show'} below in ajax success var */
				myw.popup_show('<!--...-->',{width:P[0],height:P[1],left:P[2],top:P[3],effectNo:C[2]},undefined,undefined);
				return;
			} else {
				myw.dialog_alert(myw.frontend.lang,'The link to the popup layer should have this form:<br/>\ntargetLayer=popup:WIDTHxHEIGHT');
				return;
			}
		}
				
		_effectNo>0 && document.getElementById(_div) ?
			myw.ajax.execEffect('start',vars) :
			myw.ajax.execute2(vars);
	},
	
	execute2 : function(_vars) {
  		myw.ajax.isAjax = 1;
		jQuery.ajax({
   			type: _vars.method,
   			url: _vars.url,
   			data: _vars.params,
   			success: function(_msg) {   
   				_vars.message = _msg;
   				var d = document.getElementById(_vars.div);		
  				if (d) {
	   				if (_vars.effectNo) 
						myw.ajax.execEffect('end',_vars);
						
   					if (d.innerHTML == '') {
 	   					d.style.display = 'none';
	   					d.innerHTML = _msg;
	   					jQuery(d).animate({height:'show'},'medium',function() {
	   						myw.ajax.requestComplete(_vars);
	   					});
	   				} else {
	   					if (_msg == '') {
	   						jQuery(d).animate({height:'hide'},'medium', function() {
	   							d.innerHTML = '';
	   							myw.ajax.requestComplete(_vars); 
	   						});
	   					} else if (d.innerHTML.indexOf('myw:loadingImg')!=-1) {
	   						jQuery(d).animate({height:'hide'},'medium', function() {
		   						d.innerHTML = _msg;
	   							if (_vars.callback) {
		   							var c = '';
	   								typeof(_vars.callback) == 'string' ?
	   									c = _vars.callback :
	   									c = _vars.callback.toString();
		   							if (c.indexOf('myw.expand(') == -1 && c.indexOf(').animate(') == -1)
	   									jQuery(d).animate({height:'show'},'medium');
	   							} else {
	   								jQuery(d).animate({height:'show'},'medium');
	   							}
		   						myw.ajax.requestComplete(_vars);
	   						});
	   					} else {
	   						if (d.style.display == 'none') {
	   							jQuery(d).animate({height:'show'},'medium', function() {
	   								d.innerHTML = _msg;
	   								myw.ajax.requestComplete(_vars);
	   							});
	   						} else {
	   							d.innerHTML = _msg;
	   							myw.ajax.requestComplete(_vars);
	   						}
	   					}
	     			}
     			} else {
     				myw.dialog_alert(myw.frontend.lang,'The layer ' + _vars.div + ' was not found!');
     			}
   			},
   			error : function(req, _errMsg, errorThrown) {
   				_vars.errMsg = _errMsg;
   				myw.ajax.requestError(_vars);
   			}
 		});
 	},
 		
	execEffect : function(_option,_vars) {
		/* check if the user function exists */
		var func;
		if (window.myw.websiteTemplate && window.myw.websiteTemplate['ajax_effect_'+_option+'_'+_vars.effectNo]) {
			func = 'myw.websiteTemplate.ajax_effect_'+_option+'_'+_vars.effectNo;
		} else if (window.myw.my && window.myw.my.effects_ajax && window.myw.my.effects_ajax['effect_'+_option+'_'+_vars.effectNo]) {
			func = 'myw.my.effects_ajax.effect_'+_option+'_'+_vars.effectNo;
		} else if (window.myw.effects_ajax['effect_'+_option+'_'+_vars.effectNo]) {
			func = 'myw.effects_ajax.effect_'+_option+'_'+_vars.effectNo;
		}
		
		if (func) {
			try {
				eval(func)(_vars);
			} catch (ex) {
				alert('Error by evalueting the expression:\n'+func+'\nError message:\n' + ex.message);
			}
		} else {
			alert('The effect no ' + _vars.effectNo + ' does not exist !');
		}
	},
		
	requestError : function(_vars) {
		document.getElementById(_vars.div).innerHTML="<font color='red'><b>jQuery.ajax error.<br/>Error message: " + _vars.errMsg + " at " + _vars.url + "</b></font>";
	},
	
	requestComplete : function(_vars) {
					
		if (_vars.message.indexOf('<script')>=0) 
			myw.ajax.parseScript(_vars.message);

		if (_vars.callback) {
			if (typeof(_vars.callback) == 'string') {
				try {
					eval(_vars.callback);
				} catch(ex) {
					alert('Error by evalueting the expression:\n' + _vars.callback + '\nError message:\n' + ex.message + '\nCheck the callbacks given to myw.ajax.execute()!');
				}
			} else {
				try {
					_vars.callback();
				} catch(ex) {
					alert('Error by calling the expression\n' + _vars.callback.toString() + '\nError message:\n' + ex.message + '\nCheck the callbacks given to myw.ajax.execute()!');
				}
			}
		}
	},
	
	/* from http://www.developersnippets.com/2009/05/20/evaluate-scripts-while-working-on-ajax-requests/ */
	parseScript : function(_source) {
		var source = _source;
		var scripts = new Array();			 
		while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
			var s = source.indexOf("<script");
			var s_e = source.indexOf(">", s);
			var e = source.indexOf("</script", s);
			var e_e = source.indexOf(">", e);			
			scripts.push(source.substring(s_e+1, e));
			source = source.substring(0, s) + source.substring(e_e+1);
		}
		for(var i=0; i<scripts.length; i++) {
			try {
				eval(scripts[i]);
			} catch(ex) {
				/* do what you want here when a script fails */
			}
		}
	},
	
	getLoadingImage : function() {
		return '<img src="'+myw.paths.website.htdocs.net+'/admin/img/loading.gif" />';
	},
	
	insertFragment : function(_unitId,_unitFragment,_url,_target,_effectNo) {
	
		if (!_target) 
			_target = 'div_unit_'+_unitId+'_'+_unitFragment;
		
		/* for the static pages */
		if (_url.search(/\/html\/.*\.html/) >= 0 && !document.getElementById(_target)) {
			document.location.href=_url;
			return;
		}

		if (document.getElementById(_target) || _target.indexOf('popup')==0) {
			if (_target.indexOf('popup')==-1) {		
				if (_url.search(/nh_isFromPageNavigation=1/)==-1 && _url.search(/_frg\d+.*_pg\d+\./)==-1) {
					
					/* leave only the parameters in the url */
					var url2 = _url;
					if (_url.search(/\?/) != -1)
						url2 = _url.replace(/.*?\?/,'');
						
					document.frm_main['unt_'+_unitId+'_'+_unitFragment].value = myw.ajax.encodeURL(url2);
					
					if (!myw.ajax.pHistory[_unitId]) 
						myw.ajax.pHistory[_unitId] = new Array();

					if (!myw.ajax.pHistory[_unitId][_unitFragment]) 
						myw.ajax.pHistory[_unitId][_unitFragment] = new Array();
					
					myw.ajax.pHistory[_unitId][_unitFragment].push(_url);
				}
			}
			
			var A = _url.split('?');
			if(!A[1]) 
				A[1] = '';

			var B = new Array();
			for(var i=1;i<A.length;i++) 
				B.push(A[i]);  /* splice(1) is not understood by Internet Explorer */

			myw.ajax.execute('get',A[0],B.join('-myw:63-'),_target,'',_effectNo);	/* ? can appear in the parameter searchTerm. It has to be converted */
		} else if (_unitId == 0) {
			myw.dialog_alert(myw.frontend.lang,"The topic unit does not exist!\nCheck the value in the parameter 'targetWindow'.");
		} else {
			myw.dialog_alert(myw.frontend.lang,'The layer ' + _target + ' was not found!');
		}
	},
	
	insertFragment_record : function(_unitId,_unitFragment,_params,_target,_effectNo) {
		if (_target != '' && !document.getElementById(_target)) {
			myw.dialog_alert(myw.frontend.lang,'The target layer ' + _target + ' was not found!');
			return;
		}
		
		if (_target == '')
			_target = 'div_unit_'+_unitId+'_'+_unitFragment;
		
		myw.ajax.insertFragment(_unitId,_unitFragment,myw.paths.website.cgi.net+'/bin/index.pl?'+_params,_target,_effectNo);
	},
	
	encodeURL : function(string) {
		string = string.replace(/&amp;/g,'&');
		string = string.replace(/#/g, '-myw:35-');
		string = string.replace(/%/g, '-myw:37-');
		string = string.replace(/&/g,'-myw:38-');
		string = string.replace(/\+/g,'-myw:43-');
		string = string.replace(/;/g,'-myw:59-');
		return string;
	},
	
	decodeURL : function(_url) {
		_url = _url.replace(/-myw:35-/g,'#');
		_url = _url.replace(/-myw:37-/g,'%');
		_url = _url.replace(/-myw:38-/g,'&');
		_url = _url.replace(/-myw:59-/g,';');
		return _url;
	},

	buttonBack_get : function(_unitId,_unitFragment) {
		if (!myw.ajax.pHistory[_unitId])
			myw.ajax.pHistory[_unitId] = new Array();

		if (myw.ajax.pHistory[_unitId][_unitFragment]) {
			var c = 0;
			for (var i=0;i<myw.ajax.pHistory[_unitId][_unitFragment].length;i++) {
				if(myw.ajax.pHistory[_unitId][_unitFragment][i]) 
					c++;
			}
			if (c>=2)  {
				if(document.frm_main.searchTerm) { 
					if(document.frm_main.searchTerm.value)
						document.getElementById('myw_htmlgen_btnBackSearch_'+_unitId+'_'+_unitFragment).style.display='block';
				}
				if (document.getElementById('myw_htmlgen_btnBackSearch_'+_unitId+'_'+_unitFragment).style.display == 'none')
					document.getElementById('myw_htmlgen_btnBackTopic_'+_unitId+'_'+_unitFragment).style.display='block';
				if (c!=2) document.getElementById('myw_htmlgen_btnBackBack_'+_unitId+'_'+_unitFragment).style.display='block';
			}
			if (c>1 || document.getElementById('myw_htmlgen_btnBackMyBtn_'+_unitId+'_'+_unitFragment))
				document.getElementById('myw_htmlgen_btnBackSep2_'+_unitId+'_'+_unitFragment).style.display='block';
		}
	},
	
	buttonBack_go : function(_unitId,_unitFragment,_where,_effectNo) {
		var div;
		_unitFragment>0 ?
			div = 'div_unit_'+_unitId+'_'+_unitFragment :
			div = 'div_unit_'+_unitId;

		if (_where == 'first') {
			for(var i=myw.ajax.pHistory[_unitId][_unitFragment].length-1;i>0;i--) 
				myw.ajax.pHistory[_unitId][_unitFragment][i] = undefined;
			var url = myw.ajax.pHistory[_unitId][_unitFragment][0];
			if (url.search(/page_\d+/) == -1) {
				if (url.search(/\.html$/)==-1) {
					url += '&page_'+_unitId+'_'+_unitFragment+'='+document.frm_main['page_'+_unitId+'_'+_unitFragment].value;
				} else {
					if (document.frm_main['page_'+_unitId+'_'+_unitFragment].value)
						url = url.replace(/pg\d+\.html/,'pg'+document.frm_main['page_'+_unitId+'_'+_unitFragment].value+'.html');
				}
			}
			if (document.frm_main.searchTerm) {
				if (document.frm_main.searchTerm.value) 
					url += '&searchTerm='+myw.ajax.encodeURL(document.frm_main.searchTerm.value);
			}
			document.frm_main['unt_'+_unitId+'_'+_unitFragment].value = '';
			var A = url.split('?');
			if(!A[1]) A[1] = '';
			var B = new Array();
			for(var i=1;i<A.length;i++) B.push(A[i]);  /* splice(1) is not understood by Internet Explorer */
			myw.ajax.execute('get',A[0],B.join('-myw:63-'),div,'',_effectNo);	/* ? can appear in the parameter searchTerm. It has to be converted */
		} else {
			var lastLink;
			var killSelf = 0;
			for(var i=myw.ajax.pHistory[_unitId][_unitFragment].length-1;i>=0;i--) {
				if (myw.ajax.pHistory[_unitId][_unitFragment][i] != undefined) {
					if (killSelf == 1) lastLink = myw.ajax.pHistory[_unitId][_unitFragment][i];
					if (i!=0) myw.ajax.pHistory[_unitId][_unitFragment][i] = undefined;
					if (killSelf == 1) {
						break;
					} else {
						killSelf = 1;
					}
				}
			}
			var c=0;
			for (var i=0;i<myw.ajax.pHistory[_unitId][_unitFragment].length;i++) if(myw.ajax.pHistory[_unitId][_unitFragment][i]) c++;
			if (c<=1) document.frm_main['unt_'+_unitId+'_'+_unitFragment].value = '';
		
			lastLink ? 
				myw.ajax.insertFragment(_unitId,_unitFragment,lastLink,'', _effectNo) : 
				history.back();
		}
	},
	
	/* from http://old.nabble.com/.getScript()-td9847828s27240.html */
	getCSS : function(_url,_media) {
        jQuery(document.createElement('link')).attr({
                href: _url,
                media: _media || 'screen',
                type: 'text/css',
                rel: 'stylesheet'
        }).appendTo('head');
	}
};


