/*  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(),
	isAjax : 0,
	lines : 0,
	history_step : 1,
	history_isback : 1,
			
	execute : function(_method,_link,_params,_div,_callback,_effects) {		
	
		if (!myw.countElementsInObj(_effects)) {
			if (_link.indexOf('/bin/admin_')>0) {
				_effects = { func:'myw_default',funcParams:'opacity',loadingImg:1 };
				
			/* myw.defaultEffect_other is not for the loading of unit fragments */
			} else if (_link.indexOf('getUnitFragment=')==-1 && ((typeof(_params)=='object' && !_params.getUnitFragment) || (typeof(_params)=='string' && _params.search(/getUnitFragment=\d+/)==-1))) {
				_effects = myw.defaultEffect_other;
			}
		}		
		
		if (_link.indexOf('.htm')==-1) {
			var isLogged = 0;
			if (document.location.href.search(/bin\/admin_.*?\//)>=0 || (document.frm_main && document.frm_main.gh_admin_uid && document.frm_main.gh_admin_uid.value>0))
				isLogged = 1;
				
			_link = _link.replace(/&amp;/g,'&');
						
			var isThisDomain = 0;
			if (_link.indexOf('.pdf')==-1 && (_link.indexOf(myw.config.website.cgi.net)>=0 || _link.indexOf(document.location.protocol+'//'+document.location.hostname)==0))
				isThisDomain = 1;

			if (isThisDomain == 1) {
				var GP = myw.globalHereditableParams.split('&');
				if (_method == 'get') {
				
					_params = _params.replace(/&amp;/g,'&');
					_params = _params.replace(/#/g,'%23');
					
					/* insert the missed global params */
					var P = _params.split('&');
					var GPNEW = new Array();
					for(var i=0;i<GP.length;i++) {
						var GP2 = GP[i].split('=');
						var isInString = 0;
						/* do not inherit the main template */
						/* params are in the url if mode_rewrite */
						if (_link.indexOf(GP2[0]+'=')==-1 && GP2[0] != 'gh_websiteMainTemplate') {
							for(var i2=0;i2<P.length;i2++) {
								var P2 = P[i2].split('=');
								if (P2[0] == GP2[0]) 
									isInString = 1;
							}
							if (isInString==0 && GP[i])
								GPNEW.push(GP[i]);
						}
					}
					if (GPNEW.length>0) 
						_params += '&' + GPNEW.join('&');
						
					_params += '&nh_isAjaxRequest=1';
					
					/* getTimeId to load the page from internet and not from cache */
					if (_params.search(/nh_noCache=1/) != -1 || isLogged)
						_params += '&nh_timeId='+myw.getTimeId();
					
					/* for rewrite mode */
					if (_link.search(/\/bin\/.*\.pl/)==-1) {
						_link += '&' + _params;
						_link = _link.replace(/&+/g,'&');
						_params = '';
						_link = encodeURI(_link);
					}				
				} else if (_method == 'post') {
					_params.nh_isAjaxRequest = 1;
					
					/* insert the missed global params */
					for(var i=0;i<GP.length;i++) {
						var GP2 = GP[i].split('=');
						if (!_params[GP2[0]] && GP2[0] != 'gh_websiteMainTemplate') 
							_params[GP2[0]] = GP2[1];
					}
					
					if (_params.nh_noCache==1 || isLogged)
						_params.nh_timeId=myw.getTimeId();
				}
			}
		}
					
		var vars = new Object();
		vars.method = _method;
		vars.link = _link;
		vars.params = _params;
		vars.div = _div;
		vars.callback = _callback;
		vars.effects = _effects;
						
		/* 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';

				myw.ajax.history_step = 1;
				myw.ajax.history_isback = 1;

				myw.ajax.popup_iframe.width = P[0]+'px';
				myw.ajax.popup_iframe.height = P[1]+'px';
							
				_link.search(/\/bin\/.*\.pl/)>0 ?
					myw.ajax.popup_iframe.src = _link + '?' + myw.ajax.filterParams(_params) :
					myw.ajax.popup_iframe.src = myw.ajax.filterParams(_link);	
				
				if (isThisDomain == 1)
					myw.ajax.popup_iframe.src += '&gh_isPopupLayer=1&nh_startNewWin=1';
				myw.ajax.popup_iframe.src = myw.ajax.popup_iframe.src.replace(/&+/g,'&');
											
				/* avoid animate({height:'show'} below in ajax success var */
				var effFunc = 'myw_default';
				if (C[2])
					effFunc = C[2];
				myw.popup_show({width:P[0],height:P[1],left:P[2],top:P[3],func:effFunc});
				return;
			} else {
				myw.dialog_alert(myw.frontend.lang,'The link to the popup layer should have this form:<br/>\ntargetLayer=popup:WIDTHxHEIGHT');
				return;
			}
		}
		
		var d =  document.getElementById(_div);
		if (d && _effects && _effects.func && _effects.func != 'none') {
			myw.ajax.execEffect('start',_effects.func,vars);
		} else {
			myw.ajaxAnimate.loadingImg(vars);
			myw.ajax.execute2(vars);
		}

	},
	
	execute2 : function(_vars) {
  		myw.ajax.isAjax = 1;

		jQuery.ajax({
   			type: _vars.method,
   			url: _vars.link,
   			data: _vars.params,
   			success: function(_msg) {   
   				_vars.message = _msg;
   				  			 
   				var d = document.getElementById(_vars.div);		
  				if (d) {
					var msg_noLib = _msg.replace(new RegExp("\\n","g"),'');
					msg_noLib = msg_noLib.replace(new RegExp("\\r","g"),'');
					msg_noLib = msg_noLib.replace(/<\!--LIBRARIES-->.*<\!--END LIBRARIES-->/,'');
															
   					if (d.innerHTML == '') {
 	   					d.style.display = 'none';
	   					d.innerHTML = _msg;
	   					myw.ajax.parseScript(_msg);
	   					if (msg_noLib != '') {
		   					jQuery(d).animate({height:'show'},'medium',function() {
		   						myw.ajax.requestComplete(_vars);
		   					});
		   				} else {
		   					myw.ajax.requestComplete(_vars);
		   				}
	   				} else {
	   					if (msg_noLib == '') {
	   						jQuery(d).animate({height:'hide'},'medium', function() {
	   							d.innerHTML = '';
	   							myw.ajax.parseScript(_msg);
	   							myw.ajax.requestComplete(_vars); 
	   						});
	   					} else if (d.innerHTML.indexOf('_MYW:LOADINGIMAGE') != -1) {
	   						jQuery(d).animate({height:'hide'},'medium', function() {
		   						d.innerHTML = _msg;
		   						myw.ajax.parseScript(_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 {
   							d.innerHTML = _msg;
   							myw.ajax.parseScript(_msg);
   							jQuery(d).animate({height:'show'},'medium', function() {
   								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);
   			}
 		});
 	},
 	
 	filterParams : function(s) {
		s = s.replace(/nh_isAjaxRequest=\d/g,'');
		s = s.replace(/getUnit=\w+/,'');
		s = s.replace(/getUnitFragment=\d+/,'');
 		return s;
 	},
 		
	execEffect : function(_option,_func,_vars) {
		/* check if the user function exists */
		var func;
		if (window.myw.websiteTemplate && window.myw.websiteTemplate['ajaxAnimate_'+_option+'_'+_func]) {
			func = 'myw.websiteTemplate.ajaxAnimate_'+_option+'_'+_func;
		} else if (window.myw.my && window.myw.my.ajaxAnimate && window.myw.my.ajaxAnimate['animate_'+_option+'_'+_func]) {
			func = 'myw.my.ajaxAnimate.animate_'+_option+'_'+_func;
		} else if (window.myw.ajaxAnimate['animate_'+_option+'_'+_func]) {
			func = 'myw.ajaxAnimate.animate_'+_option+'_'+_func;
		}
		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 ' + _func + ' 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.link + "</b></font>";
	},
	
	requestComplete : function(_vars) {
		_vars && _vars.effects && _vars.effects.func && _vars.effects.func != 'none' ?
			myw.ajax.execEffect('end',_vars.effects.func,_vars) :
			myw.ajaxAnimate.loadingImgDelete(_vars);

		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) {
		if (_source.indexOf('<script')>=0) {
			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 */
				}
			}
		}
	},
		
	insertFragment : function(_unitId,_unitFragment,_link,_target,_effects) {
		
		if (!_target) 
			_target = 'div_unit_'+_unitId+'_'+_unitFragment;
		
		/* for the static pages */
		if (_link.search(/\/html\/.*\.html/) >= 0 && !document.getElementById(_target)) {
			document.location.href=_link;
			return;
		}

		if (document.getElementById(_target) || _target.indexOf('popup')==0) {
			var url = _link;
			var params_execute = '';
			var params_unit = _link;
			if (_link.search(/\/bin\/.*\.pl/) >= 0) {	/* dynamic mode */
				url = _link.replace(/index.pl\?.*/,'index.pl');
				params_execute = _link.replace(/.*index\.pl\?/,'');
				params_unit = params_execute;
			}

			if (_target.indexOf('popup')==-1 && _link.indexOf('nh_isFromPageNavigation=1')==-1 && _link.search(/_frg\d+.*_pg\d+\./)==-1) {	
				
				params_unit = params_unit.replace(/&amp;/g,'&');
				document.frm_main['unt_'+_unitId+'_'+_unitFragment].value = encodeURI(params_unit);
																	
				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(_link);
			}
			
			myw.ajax.execute('get',url,params_execute.replace(/\?/g,'%3F'),_target,'',_effects);	/* ? 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,_effects) {
	
		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;
		
		document.getElementById(_target).style.display='none';
		
		var l = _params; /* rewrite mode */
		if (_params.indexOf('http://')==-1 && _params.indexOf('https://')==-1)
			l = myw.config.website.cgi.net+'/bin/index.pl?'+_params;	/* dynamic mode */
			
		myw.ajax.insertFragment(_unitId,_unitFragment,l,_target,_effects);
	},
	
	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,_effects) {
		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='+escape(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('%3F'),div,'', _effects);	/* ? 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,'', _effects) : 
				history.back();
		}
	},
	
	/* from http://old.nabble.com/.getScript()-td9847828s27240.html */
	getCSS : function(_link,_media) {
        jQuery(document.createElement('link')).attr({
                href: _link,
                media: _media || 'screen',
                type: 'text/css',
                rel: 'stylesheet'
        }).appendTo('head');
	}
};


