//
//	Functions for AJAX use
//	Copyright OLC Systems s.r.o.
//	Source:  http://www.sitepoint.com/article/take-command-ajax
//	Modified by: David pokorny

/*
 * @param async if false then a client waits for a server's response
 */
function makeHttpRequest(httpServer, paramsString, requestName, elementId, targetdiv, async, functionname, method, postParams) {
   var http_request;
   http_request = false;

   if (targetdiv==undefined) {
	   targetdiv = true;
   }

   if (async==undefined) {
	   async = true;
   } else {
	   if (async!=false) {
		   async = true;
	   }
   }
   
   if (method==undefined) {
	   method = 'GET';
   }
  
   if (postParams==undefined || method == 'GET') {
	   postParams = null;
   } 
   
   var mytime = "&antiCache="+new Date().getTime();
   url = httpServer+"?request="+requestName;
   // prepare url add cookie identification

   var targetdivvalue="true";
   if (targetdiv==true) {
   		targetdivvalue = "true";
   } else {
   		targetdivvalue = "false";
   }
   
   var asyncvalue="true";
   if (async==true) {
   		asyncvalue = "true";
   } else {
   		asyncvalue = "false";
   }
   
   paramsString = encodeURI(paramsString);
   if ( paramsString.substring(0, 1) != "&" )
   {
	   paramsString = "&"+paramsString;
   }
   if (functionname==undefined || functionname=='') 
   {
	   functionname = "";
   }
   url = url + "&ajax=1"+paramsString+mytime+"&elementid="+elementId+"&targetdiv="+targetdivvalue+"&async="+asyncvalue+"&functionname="+functionname;
   
   if (window.XMLHttpRequest) { // Mozilla, Safari, IE7...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
       }
   } else if (window.ActiveXObject) { // <=IE6
       try {
           http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
           try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {}
       }
   }

   if (!http_request) {
       alert('Váš prohlížeč nepodporuje techniku AJAX\'t Použíjte prosím kompatibilní prohlížeč.');
       return false;
   }
   
   if (async==true) {
     http_request.onreadystatechange = function() {
         if (http_request.readyState == 4) {
             if (http_request.status == 200) {
            	 if (functionname==undefined || functionname=='') {
	            	  if (targetdiv) {
	   	              	eval('setContent("'+elementId+'",http_request.responseText)');
                        JsCore.convertNewCheckboxesIfFancyForm();
	   	              } else {
	  	 	            eval('fillObject("'+elementId+'",http_request.responseText)');
	   	              }
            	 } else {
            		 eval(functionname+'("'+elementId+'",http_request.responseText)');
                     JsCore.convertNewCheckboxesIfFancyForm();
            	 }
             }
         }
     }
   }

   
   http_request.open(method, url, async);
   http_request.setRequestHeader('X_REQUESTED_WITH', 'XMLHttpRequest');
   
   if (method=="POST") {
	   http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	   http_request.setRequestHeader("Content-length", postParams.length);
	   http_request.setRequestHeader("Connection", "close");
   }
   
   http_request.send(postParams);
   
   // Async call
   if (async==false) {
      if (http_request.status == 200) {
       		  if (targetdiv) {
            	eval('setContent("'+elementId+'",http_request.responseText)');
                JsCore.convertNewCheckboxesIfFancyForm();
            } else {
              eval('fillObject("'+elementId+'",http_request.responseText)');
            }

       } else {
           // alert('There is problem with communication. (Return code: ' + http_request.status + ')');
       }
   }
}

// callback function
function fillObject(objectId,htmlresponse) {

    targetObject = document.getElementsByName(objectId);

    if (!targetObject[0]) {
    	// window.alert("Neplatný cílový object "+objectId);
    	return;
    }
        
    targetObject[0].value = htmlresponse;
    externallinks();
}

// callback function
function setContent(elementId,htmltext) {
   // check if elementid exist
    targetObject = document.getElementById(elementId);
    if (htmltext.substr(0,1)!="<") {
    	if (htmltext.length>0) {
    		window.alert(htmltext);
    	}
    } else {
    	if(htmltext.length>0) { 
		    if (!targetObject) {
			  // window.alert("Target object "+elementId+" doesnot exist.");
		    } else {
			  document.getElementById(elementId).innerHTML=htmltext;
			  externallinks();
		    }
		}
	}
}

function getXmlObject(xmlData) {
	try //Internet Explorer
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(xmlData);
	}
	catch(e)
	{
	try //Firefox, Mozilla, Opera, etc.
	{
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(xmlData,"text/xml");
	}
	catch(e)
	{
		alert(e.message);
		return null;
	}
	}
	return xmlDoc;
}

function callbackExecuteAllScriptsInResponse(targetDiv,xmlData) {
    setContent(targetDiv,xmlData);

    AjaxCore.executeScriptsInDiv(targetDiv);
}

// Send forms to ajax function 
// Author: David Pokorny 
function sendFormByAjax(phpform, requestName, formElementId,buttonName) { 
	/* validate */
	if (phpform.enctype!="application/x-www-form-urlencoded") {
		alert("Invalid encoding type is occured.");		
	}
	
	if (buttonName==undefined) {
		buttonName = "submit";
	}
	
	/* don't use this params from form action, they are defined in this function */
	var skipParamsArray = new Array("request","ajax","elementid","targetdiv","async","functionname");
	
	/* Get params string from form action */
	var paramsString="";
	var separator = "";
	var postParams = "";
	
	separator = "&";
	var defaultParamsString = phpform.action.substring(phpform.action.indexOf("?")+1);
	var paramsArray = defaultParamsString.split(separator);
	separator = "";
	
	for (var c=0; c < paramsArray.length; c++  )
	{
		var delItem = false;
		var promArray = paramsArray[c].split("=");
		
		for (var a=0; a < skipParamsArray.length; a++)
		{
			if (promArray[0] == skipParamsArray[a])
			{
				delItem = true;
				break;
			}
		}
		
		if (!delItem)
		{
			paramsString = paramsString + separator + paramsArray[c];
			separator = "&";
		}
	}
	separator = "";
	
	 

        AjaxCore.updateAllFCKEditors();
        
	for (var cycle=0;cycle<phpform.length;cycle++)
	{
	  if (phpform.elements[cycle].type=="file" || phpform.elements[cycle].type=="button"
		  || phpform.elements[cycle].type=="submit") {
		  
		// file and buttons is ignored except main button		  
		if (phpform.elements[cycle].name!=buttonName) {
			continue;
		}
	  }

	  var name = phpform.elements[cycle].name;	  
	  if (phpform.elements[cycle].type=="checkbox") {
		  if (phpform.elements[cycle].checked==true) {
			  var value = phpform.elements[cycle].value;  
		  }	else {
			  var value = "";
		  }
	  } else {			 
		  var value = phpform.elements[cycle].value;		  
	  }	  
	  postParams = postParams +separator+ name+"="+encodeParam(value);	  
	  separator = "&";
	}
	
	/* call ajax method */	 
	makeHttpRequest("index.php", paramsString, requestName, formElementId, true, true,"callbackExecuteAllScriptsInResponse", "POST", postParams); 
}

function encodeParam(value)
{
	value = encodeURI(value);
	
	value = nReplace("+", "%2B", value);
	value = nReplace("&", "%26", value);
	value = nReplace("=", "%3D", value);
	
	function nReplace(searchString, replaceWith,  value2) 
	{
		while (value2.lastIndexOf(searchString) >= 0)			
		{
			value2 = value2.replace(searchString, replaceWith);
		}
		return value2
	}
		
	return value;	
}

/**
 * Namespace for ajax functions
 */
function AjaxCore() {}

/**
 * Function for invalidate div in page, used in ajax
 */
AjaxCore.invalidDiv = function(divId) {
	object = document.getElementById(divId);
	if (object == undefined) 
	{
		return;
	}	
	startSep = "<!--[[[";
	endSep = "]]]-->";
	startPosition = object.innerHTML.lastIndexOf(startSep);
	if (startPosition > 0) 
	{
		slice = object.innerHTML.substr(startPosition+startSep.length);	
		eval(slice.substr(0,slice.indexOf(endSep)));
	}
}

/**
 * Update hidden textareas with content from FCKeditors
 */
AjaxCore.updateAllFCKEditors = function() {
    var iframes = $$('iframe[id*=___Frame]');
    $each(iframes, function(data, key){
        var splitedID = data.id.split("___");
        var fck = FCKeditorAPI.GetInstance(splitedID[0]);
        if (fck != undefined) {
            fck.UpdateLinkedField();
        }
    });
}

/**
 * This function is used if singleform file upload with "false ajax" is used.
 * File upload with "false ajax" loads it's content into a hidden iframe.
 * This function cuts a form from iframe and paste it into a page.
 * 
 * @param formID form id
 */
AjaxCore.fileUploadOnLoad = function(formID) {
    var messageBoxTopWin = $("messagebox");
    if (messageBoxTopWin != undefined) {
        messageBoxTopWin.parentNode.removeChild(messageBoxTopWin);
    }

    var iframe = $(formID+'__ajaxUpload');
    var formToReplace = $(formID);

    formToReplace.action = iframe.contentDocument.getElementById(formID).action;
    formToReplace.innerHTML = iframe.contentDocument.getElementById(formID).innerHTML;

    var messageBox = iframe.contentDocument.getElementById("messagebox");

    if (messageBox != undefined) {
        formToReplace.parentNode.innerHTML = formToReplace.parentNode.innerHTML+"<div class=\"messagebox_warning\" id=\"messagebox\">"+messageBox.innerHTML+"</div>";
    }

    AjaxCore.executeScriptsInDiv(formID);
}

/**
 * Execute all javascript in script elements in div with given id
 */
 AjaxCore.executeScriptsInDiv = function(targetDiv) {
    var el = document.getElementById(targetDiv);
    var allNewScripts = el.getElementsByTagName('script');

    if (allNewScripts.length < 1) {
        return;
    }

    var jqueryDialog = false;

	/* NEFUNGUJE SPRAVNE PROC TO TADY BYLO ZAPOZNAMKOVAL DAVID
    /*for (var i = 0; i < allNewScripts.length; i++) {
        if ((allNewScripts[i].innerHTML.match(/jQuery\([^\)]*\).dialog\(/i)))
        {
            jqueryDialog = true;
            break;
        }
    }*/

    if (!jqueryDialog)
    {
        for (var i = 0; i < allNewScripts.length; i++) {
            eval(allNewScripts[i].innerHTML);
        }
    }
    else
    {
        for (var i = 0; i < allNewScripts.length; i++) {
            if (allNewScripts[i].innerHTML.match(/jQuery/))
            {
                eval(allNewScripts[i].innerHTML);
            }
        }
    }
 }
