// generates the url for a transformer with given settings
// callbackFunction is optional - if supplied, it will be called
// when generateURL is done with the generated url as a parameter
function generateURL(dappName, transformerName, clickedButton, callbackFunction) {
	var args   = new Array('dappName='+dappName);
  if (transformerName != 'XML')
    args.push('transformer='+transformerName);
  else
    args.push('v=1');
    
  var settings = getTransformerSettings(transformerName, false);
  if (settings.failed) {
    var highlightElement = settings.failedElement;
    if (highlightElement.getAttribute('type') && highlightElement.getAttribute('type') == 'checkbox')
      highlightElement = highlightElement.parentNode;
    
    new Effect.Highlight(highlightElement, {startcolor:'#ffff99'});
    Element.hide(transformerName+'_chickletUrl');
    
    setPreviewMessage('<br /><br />Choose fields above to<br /> preview here', transformerName);

  	return false;
  }
  else {
  	hidePreviewMessage(transformerName);
  }
     
  // if there is a username and password, we encrypt it via ajax and add an 
  // argument to indicate this
  if (settings['username'] && settings['password']) {
    // make a waiting image and show it and hide the generate button
    if (clickedButton) {
      var waitingImg = document.getElementById(transformerName+'_waitingImage');
      Element.show(waitingImg);
      Element.hide(clickedButton);
    }
        
    args.push('encryptionAlg=1');
    
    var url = location.protocol+'//'+location.host+
              '/encrypt-credentials.jsp';
    var par = 'username='+encodeURIComponent(settings['username'])+'&'+
              'password='+encodeURIComponent(settings['password']);
    var myAjax = new Ajax.Request(
      url,
      {
        method: 'post',
        parameters: par,
        onComplete: function(originalRequest) { 
                      var encValues;
                      eval("encValues = "+originalRequest.responseText);
                      for (var encName in encValues)
                        settings[encName] = [encValues[encName]];
                      
                      if (clickedButton) {
                        Element.show(clickedButton);
                        Element.hide(waitingImg);
                      }
                      
                      return completeGenerateURL(transformerName, args, settings, callbackFunction);
                    }
      }
    
    );
  }
  // otherwise, we just go on like normal
  else
    return completeGenerateURL(transformerName, args, settings, callbackFunction);
  
}


// when using username password encryption, this is called after the ajax 
// call returns with the encryption.  regardless, it is called from generateURL.
// callbackFunction is optional - if supplied, it will be called
// when generateURL is done with the generated url as a parameter
function completeGenerateURL(transformerName, args, settings, callbackFunction) {
  for (var argName in settings) {
    for (var i = 0; i < settings[argName].length; i++)
      args.push(argName+'='+encodeURIComponent(settings[argName][i]));
  }

  var url = 'http://'+location.host+'/'+
            (transformerName == 'XML' ? 'RunDapp' : 'transform.php')+
            '?'+
            args.join('&');
  
  // to keep service URLs in the proper format          
  //    get rid of the indexes in the extraArgs arrays.
  url = url.replace(/\[[^\]]+\]/g,"[]") ;      
  
  //$(transformerName+'_urlSpace').innerHTML = '<a href="'+url+'" style="font-weight:normal; background: none;color:#0066ff;"><nobr>'+url+'</nobr></a>';
	$(transformerName+'_urlSpace').innerHTML = '<input type="text" value="'+url+'" class="urlSpaceInput" readonly="readonly" onclick="this.select();" />';
  $(transformerName+'_url').value = url;
  $(transformerName+'_chickletLink').href=url;
  Effect.Appear(transformerName+'_chickletUrl');
  
  
  
  if (callbackFunction) {
    callbackFunction(url);
  }
  
  if (!safari)
	  setPreviewMessage('<br /><br />Generating preview', transformerName);
	else
	  hidePreviewMessage(transformerName);
	  
  $(transformerName+'_transformerPreview').src = url+'&previewMode=1&logIgnore=1' + optimizeArgs;
  //top.transformerPreview.onload = function () {hidePreviewMessage(transformerName,settings);}
 
  // toggle too long url message
	// some RSS readers such as google reader can't process long url's fro RSS feeds.
	// We will recommend the user to create a service for URLs longer than x characters
	// (Ugly Hack)
  //  if ( transformerName == "RSS" )
  //  {
  //		$('tooLongURL').style.display = String(url).length >= 250 ? 'block' : 'none';
  //  }
 
  return url;
}

function setService(dappName)
{
	toggleAccordionBar('short_url');
	$('serviceTitle').value = dappName;
}

// returns the transformer's settings from the html form
// if ignoreInputs is true, it will ignore applyToUrl and url variables
function getTransformerSettings(transformerName, ignoreInputs) {
  eval('var form = document.'+transformerName+'_form');
  var inputs = form.elements;

  var settings = {};      

  if (inputs) {
    for (var i=0; i<inputs.length; i++) {
      if (inputs[i].getAttribute('ignore'))
        continue;
    
      // multi selects are handled differently
      if (inputs[i].tagName == 'SELECT' && inputs[i].getAttribute('multiple')) {
        for (var t=0; t<inputs[i].options.length; t++) {
          if (inputs[i].options[t].selected) {
            if (typeof settings[inputs[i].name] == 'undefined')
              settings[inputs[i].name] = new Array();
  
            settings[inputs[i].name].push(inputs[i].options[t].value);
          }
        }
      }
      // if the input isn't isn't disabled, it doesn't say GENERATE_EMPTY,
      // and if it is non empty (unless its a variableArg, then empty ok)
      else if (inputs[i].value != 'GENERATE_EMPTY' && 
               (inputs[i].value.length > 0 || inputs[i].name.match(/^variableArg_/)) && 
               !inputs[i].disabled) { 
               
        if (!ignoreInputs || (inputs[i].name != 'applyToUrl' && !inputs[i].name.match(/^variableArg_/))) {
          if (inputs[i].type != 'checkbox' || (inputs[i].type == 'checkbox' && inputs[i].checked))
            settings[inputs[i].name] = new Array(inputs[i].value);
        }
      }
      
      // make sure that if this setting is required, that we have it
      if (!ignoreInputs && inputs[i].getAttribute('required') == 'true' && !settings[inputs[i].name]) {
      	
      	// check boxes are special (if anyone in a group of checkboxes is checked, that's good enough)
      	if (inputs[i].className.match(/basename_/)) {
	      var theCheckBoxes = document.getElementsByClassName(inputs[i].className);
	  	  var someBoxIsChecked = false;
	  	  theCheckBoxes.each(function(el) { if (el.checked) someBoxIsChecked = true; });
	      if (someBoxIsChecked)
	  		continue;
      	}
      	
        return {failed:true, failedElement:inputs[i]};
      }
    }
  }

  return settings;
}

function switchUrlVsArgs(idx, transformerName) {
  var thisDivId  = 'div_'+transformerName+'_'+idx;
  var otherDivId = 'div_'+transformerName+'_'+Math.abs(1-idx);
  Element.hide(otherDivId);
  //Effect.Appear(thisDivId);
  Element.show(thisDivId);
  $(transformerName+'_form').applyToUrl.disabled = (idx == 1);
  var variableArgs = document.getElementsByClassName(transformerName+'_variableArg');
  for (var j=0; j<variableArgs.length; j++)
    variableArgs[j].disabled = (idx == 0);
}

function toggleVariables (transformerName) {
	Element.toggle('changeInputVariables');
	var thisDivId = 'div_'+transformerName+'_inputVariables';
	Element.toggle(thisDivId);
}
function chooseTransformer() {
	
	var server = chooseTransformer.arguments[0];
	var dappName = chooseTransformer.arguments[1];
	var useTransformer = chooseTransformer.arguments[2];
	// preSetTransformer is used to pass the transformerName to the ajax call
  var preSetTransformer = null;
  // if the user has agreed to the terms of use, this is set to true
	var agreedToTerms = false;
	
	// transformerName is the variable passed to the ajax call
	var transformerName = null;
	
	
  var transformerChoiceSelect = $('transformerChoice');
  
  // if transformer details were passed, that means the user clicked it on the page
  if (!useTransformer)
    transformerName = transformerChoiceSelect.options[transformerChoiceSelect.selectedIndex].value;
    
  // otherwise it means we want to automate a user click
  // with predefined settings (this has to do with templating in the dapp factory)
  else {
    for (var i = 0; i < transformerChoiceSelect.options.length; i++) {
      if (transformerChoiceSelect.options[i].innerHTML == useTransformer.transformerName)
        transformerChoiceSelect.selectedIndex = i;
    }
    transformerName = useTransformer.transformerName;
  }

  if (chooseTransformer.arguments.length>3) {
		agreedToTerms = chooseTransformer.arguments[4];
		transformerName = chooseTransformer.arguments[3];
    
	} 
  

  // now render the transformer pane
  var url = location.protocol+'//'+server+
            '/transformer-details-ajax.php';
  var par = 'dappName='+dappName+
            '&transformerName='+transformerName+((agreedToTerms)?'&agreedToTerms='+agreedToTerms:'');
  var myAjax = new Ajax.Request(
    url,
    {
      method: 'get',
      parameters: par,
      onComplete: function(originalRequest) { 
                    $('transformerDetails').innerHTML = originalRequest.responseText;
                    Element.hide('transformerChooser');
										Element.hide('transformerPreview');
                    Element.show('transformerDetails');

                    Element.hide('useDappText');
                    Element.show('useDappLink');

                    // if requested, then prechoose a bunch of settings as defined in
                    // the template when the user created the dapp
                 	  if (useTransformer) {
                      var f = $(useTransformer.transformerName+'_form');
                      for (var tSetting in useTransformer) {
                        var tSettingArgument = useTransformer[tSetting];
                        if (tSetting == 'transformerName')
                          continue;
                        
                        var setting = f['extraArg_'+tSetting];
                        if (!setting){
                          setting = Form.getInputs(f, 'checkbox');
                        }
                        if (setting){
                          if (setting.options) {
                            for (var s = 0; s < setting.options.length; s++) {
                              if (setting.options[s].innerHTML == useTransformer[tSetting]) {
                                setting.selectedIndex = s;
                                setting.options[s].selected = true;
                                break;
                              }
                            }
                          } else {
                            var argsRegexp = new RegExp('^extraArg_' + tSetting, 'i');
                            for (var s = 0; s < setting.length; s++){
                              var inputElement = setting[s];
                              if ((argsRegexp.exec(inputElement.getAttribute('name')) != null) && (inputElement.value == tSettingArgument)){
                                inputElement.checked = true;
                              }
                            }
                          }
                        }
                      }    
                 	  }
                 	  
                    //if sowPreview then display the preview
                    generateURL(dappName,transformerName, $(transformerName+'_button') );
                    
                    
                    
                   /*
                    * 
                    new Form.Observer(
                    	transformerName+"_form", 2, function() {
                        if ($('showPreview').checked) { 
	                    	  generateURL(dappName,transformerName, $(transformerName+'_button') ); 
	                      }
	                    }
	                  );
                    */
                    var formElements = Form.getElements(transformerName+'_form');
                    for (var f = 0; f < formElements.length; f++) {
                        
                      if (formElements[f].type == 'text')
                        continue;
                      
                   	  new Form.Element.EventObserver(formElements[f], 
                   	                   function() {
                   	                     if ($('showPreview').checked) {generateURL(dappName,transformerName, $(transformerName+'_button')); }}
                   	                   );
                   	}

                  }
    }
  
  );
  // have to make this call here, so the overlay will be removed when the terms of use pane loads
	if (useTransformer) {
  	Element.hide('useTransformerOverlay');
	}
}

function resetPage() {
	Element.show('transformerChooser');
  Element.show('transformerPreview');
	Element.hide('transformerDetails');
  Element.show('useDappText');
  Element.hide('useDappLink');
  
  return false;                 
}

function hidePreviewMessage(transformerName) {
	if ($(transformerName+'_transformerPreview').src == '' && !safari)
	  return;
	  
  Element.hide(transformerName+'_transformerPreviewMessage');


  // Element.show(transformerName+'_transformerPreviewContainer');
	// FireFox has a horrendously icky bug that doesn't respect content type = text/xml in 
	// an iframe when the src of the iframe is set while the iframe is inside a hidden element
	// so we have to this horrible stuff to make the iframe invisible, yet not hidden
	// if you change the styles below, make sure to change the css as well (no help there, 
	// the css is spread out all over the place, but right now it's in dapp-howto-use.php, mwahahaha)
	var tPM = $(transformerName+'_transformerPreviewMessage');
  var tPC = $(transformerName+'_transformerPreviewContainer');
  tPC.style.width = tPM.style.width;
  tPC.style.height = tPM.style.height;
  tPC.style.border = '1px solid #999999';
  tPC.style.display = 'block';
  tPC.style.overflow = 'visible';

  var tP = $(transformerName+'_transformerPreview');  
  tP.style.width = document.all ? '418px' : '430px';
  tP.style.height = '250px'
  tP.style.display = 'block';
  tP.style.overflow = 'visible';

}
function setPreviewMessage(msg,transformerName) {
	// sets the preview error or loading message, shows it,  and hides the iframe
  $(transformerName+'_transformerPreviewMessage').innerHTML = msg;

  // Element.hide(transformerName+'_transformerPreviewContainer');
	// FireFox has a horrendously icky bug that doesn't respect content type = text/xml in 
	// an iframe when the src of the iframe is set while the iframe is inside a hidden element
	// so we have to this horrible stuff to make the iframe invisible, yet not hidden
  var tPC = $(transformerName+'_transformerPreviewContainer');  
  tPC.style.width = '0px';
  tPC.style.height = '0px'
  tPC.style.border = '0px';
  tPC.style.display = 'inline';
  tPC.style.overflow = 'hidden';
  
  var tP = $(transformerName+'_transformerPreview');  
  tP.style.width = '0px';
  tP.style.height = '0px'
  tP.style.display = 'inline';
  tP.style.overflow = 'hidden';

  Element.show(transformerName+'_transformerPreviewMessage');
}
function agreedToTerms(dappName,transformerName) {
        var url = location.protocol+'//'+location.host+
                  '/agreed-to-terms.php';
        var par = 'dappName='+dappName+'&transformerName='+transformerName;
        var myAjax = new Ajax.Request(
          url,
          {
            method: 'get',
            parameters: par,
            onComplete: function(originalRequest) {
                          var xml = originalRequest.responseXML;

                          var statuses = xml.documentElement.getElementsByTagName('status');
                          var sts = statuses[0].firstChild.nodeValue;

                          var msgs = xml.documentElement.getElementsByTagName('message');
                          var img = msgs[0].firstChild.nodeValue;
                            
                          chooseTransformer(dappName,transformerName);
                        }
          }

        )

    }
