/**
 * @author Stefano Crosta
 * copyright 2009 Slice Factory
 *
 *   very simple functions for the main demo
 */

function explodeObject(obj, obj_name) {
result="";
for (var i in obj) 
        result += "<p>"+obj_name + "." + i + " = " + obj[i] + "</p>";
return result; 
}

// serializes an XML object to a string, both under IE & other browsers
function serializeDom(xmlNode)
{
/*  try {
    // Gecko-based browsers, Safari, Opera.
    return (new XMLSerializer()).serializeToString(xmlNode);
  }
  catch (e) {  
    try {
      // Internet Explorer.	  
      return xmlNode.xml;
    }
    catch (e)
    {//Strange Browser ??
     alert('Xmlserializer not supported: '+e.message);
    }
  }
  return false; */
  return xmlNode.innerHTML;
}

function recreateResultIframe(){
   var iframe=document.getElementById("resultframe");
   var parent=iframe.parentNode;
   parent.removeChild(iframe);
   var newIframe = document.createElement('iframe');
   newIframe.setAttribute('id','resultframe');
   parent.appendChild(newIframe);
}

function parseDOM(text) {
//creates a real document thanks to a frame!
  var iframe = document.createElement('iframe');     
  iframe.style.display = "none";  
  document.getElementsByTagName('body')[0].appendChild(iframe);//in case it needs to be somewhere...  
  
  var oDoc = (iframe.contentWindow || iframe.contentDocument);
  if (oDoc.document) oDoc = oDoc.document;  
  
  /* pour IE, otherwise body is empty!!*/
  oDoc.open();  
  //oDoc.write("Hello IFrame!");  
  oDoc.close(); 
    
  oDoc.body.innerHTML=text;     
   
  return oDoc;
  
}

function step1() {
	doXhrBrowser("get", document.getElementById("demo3url").value,null)
}

function step2() {
	doXhrBrowser("get", "http://www.yahoo.com",null)
}

function step3() {
	doXhrBrowser("get", document.getElementById("demo3url").value,null )
}

function xhrResponseBrowser(responseText) {
	responseText=mixendo.parseForXHRBrowsing(responseText,"doXhrBrowser");
	
	var resultHtml = mixendo.getIFrameBody(document.getElementById('resultframe'));	
	if (resultHtml) resultHtml.innerHTML=responseText;
	
}

function doXhrBrowser(mode, url, callerId) {

		var params;
		
		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function(){
			if(xhr.readyState==4)
			{				    		   
				if (xhr.status!=200) 
					{alert("We are sorry, there was an error processing your request: "+xhr.status+": "+xhr.statusText+". Please forgive us, and try realoading the page");}
				else
					xhrResponseBrowser(xhr.responseText);
			}
		}
			
		xhr.open(mode,url);
//get form params if post and callerId
	    if (callerId) {
			
			var caller=mixendo.getIFrameDocument(document.getElementById("resultframe")).getElementById(callerId);		   
			//get all: input, button, textarea
			var inputs = caller.getElementsByTagName("input");			
			var buttons = caller.getElementsByTagName("buttons");
			var textareas = caller.getElementsByTagName("textarea");
			
			params = "";			
			
			/* inputs.foreach(function(input){
				params+=input.name+"="+input.value+"&";
			}); */
			
			for (var i = 0; i < inputs.length; i++) {
				params+=inputs[i].name+"="+inputs[i].value+"&";
			}
			
			params = params.substr(0, params.length-2);			
				
			//Send the proper header information along with the request
			xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xhr.setRequestHeader("Content-length", params.length);
			xhr.setRequestHeader("Connection", "close");		   
		}		
					
		if (params && mode=="post") {		
			xhr.send(params);}
		else {
			xhr.send();}
		
	}




function doXhr(url, jscode, noupdate, newframe) {

/*
NB. it might be a good idea to recreate the IFRAME every time to avoid problems
*/
	// get url from input if it does not come by parameter	
	
	if (newframe) {
	  recreateResultIframe();
	}

	if (!url) {
	 url = document.getElementById('url').value;	
	}
	
	var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){

    	if(xhr.readyState==4)
		{				    
		    if (!xhr.responseXML) {
				xhr.responseXML=parseDOM(xhr.responseText);
			}			
			loadOk(xhr.status, xhr.statusText, xhr.responseText, xhr.responseXML, jscode, noupdate);
		}
	}

	xhr.open('GET',url);
	
	xhr.send();	
}

function loadOk(status, statusText, responseText, responseXML, jscode, noupdate) {

	if (status!=200) {alert("We are sorry, there was an error processing your request: "+status+": "+statusText+". Please forgive us, and try realoading the page");}

	var resultHtml = getIFrameBodyById('resultframe');
	var resultRaw = document.getElementById('resulttext');
	//var resultDiv = document.getElementById('resultdiv');//not really used for the moment.	
			
	if (jscode) {
		window.eval(jscode);
	}
    if (!noupdate) {
		if (resultHtml) resultHtml.innerHTML=responseText;
		if (resultRaw)  resultRaw.value=responseText;
	}
   //call eval if necessary      
}

function getIFrameBodyById(fid)
{
  if (frame=document.getElementById(fid))
   return getIFrameBody(frame)
  else
   return null;
}

function getIFrameBody(oIframe) {  
  var oDoc = (oIframe.contentWindow || oIframe.contentDocument);
  if (oDoc.document) oDoc = oDoc.document; 
  return oDoc.body;
}

function displayElement(on,off1,off2) {
  if (on) {
	if (el=document.getElementById(on)) {
	  el.style.display="block";
	  }
  }
  if (off1) {
	if (el=document.getElementById(off1)) {
	  el.style.display="none";
	  }
  }
  if (off2) {
	if (el=document.getElementById(off2)) {
	  el.style.display="none";
	  }
  }
  return false;
}

function toggle(id) {
  if (id) {
	if (el=document.getElementById(id)) {	
		if (el.style.display=="block") {
			el.style.display="none";
		}
		else {
			el.style.display="block";
		}
	  }
  }
  return false;
}

function traverseDOMTree(targetDocument, currentElement, depth, filter)
{
  if (currentElement)
  {
    var j;
    var tagName=currentElement.tagName;
	if (!document.level) document.level=new Array();
	if (!document.level[depth]) document.level[depth]=new Array();
	if (!document.level[depth][tagName]) document.level[depth][tagName]=1;
	else
		document.level[depth][tagName]++;
    // Prints the node tagName, such as <A>, <IMG>, etc
	if ((!filter) || (filter==tagName)) {
    if (tagName)
      targetDocument.writeln((document.level[depth][tagName]-1)+":"+"&lt;"+currentElement.tagName+"&gt;");
    else
      //targetDocument.writeln("[unknown tag]");
	  //debugging: targetDocument.writeln(currentElement+": "+(depth>1?explodeObject(currentElement,'.'):""));
	  targetDocument.writeln(currentElement+": "+currentElement.nodeValue);
    }
    // Traverse the tree
    var i=0;
    var currentElementChild=currentElement.childNodes[i];
    while (currentElementChild)
    {
      // Formatting code (indent the tree so it looks nice on the screen)
      targetDocument.write("<BR>\n");
      for (j=0; j<depth; j++)
      {
        // &#166 is just a vertical line
        targetDocument.write("&nbsp;&nbsp;&#166");
      }								
      targetDocument.writeln("<BR>");
      for (j=0; j<depth; j++)
      {
        targetDocument.write("&nbsp;&nbsp;&#166");
      }					
      if (tagName)
        targetDocument.write("--");

      // Recursively traverse the tree structure of the child node
      traverseDOMTree(targetDocument, currentElementChild, depth+1);
      i++;
      currentElementChild=currentElement.childNodes[i];
    }
    // The remaining code is mostly for formatting the tree
    targetDocument.writeln("<BR>");
    for (j=0; j<depth-1; j++)
    {
      targetDocument.write("&nbsp;&nbsp;&#166");
    }			
    targetDocument.writeln("&nbsp;&nbsp;");
    if (tagName)
      targetDocument.writeln("&lt;/"+tagName+"&gt;");
  }
}

////////////////////////////////////////////
// This function accepts a DOM element as parameter and prints
// out the DOM tree structure of the element.
////////////////////////////////////////////
function printDOMTree(domElement, filter, destinationWindow)
{
  // Use destination window to print the tree.  If destinationWIndow is
  //   not specified, create a new window and print the tree into that window
  var outputWindow=destinationWindow;
  if (!outputWindow)
    outputWindow=window.open();

  // make a valid html page
  outputWindow.document.open("text/html", "replace");
  outputWindow.document.write("<HTML><HEAD><TITLE>DOM</TITLE></HEAD><BODY>\n");
  outputWindow.document.write("<CODE>\n");
  traverseDOMTree(outputWindow.document, domElement, 1, filter);
  outputWindow.document.write("</CODE>\n");
  outputWindow.document.write("</BODY></HTML>\n");
  
  // Here we must close the document object, otherwise Mozilla browsers 
  //   might keep showing "loading in progress" state.
  outputWindow.document.close();
}
