| /* webfan (C) Till Wehowski, Webfan.de - All rights reserved. */ 
var frdlBounce = function(json){
	    var o = ('string'===typeof json.out) ? json.out : JSON.stringify(json);
	   	   console.log('You SHOULD set a callback function!' + o);
	   	   
	   	   $('<div></div>').appendTo('.cmd_terminal_content').html(o); 
};
var frdlBounce_Default = frdlBounce;
$(document).ready(function() {
  $.fn['PttyLoad'] = function(options) {
  	
     this.user_token =  ('undefined'!==typeof $.WebfanDesktop.Registry && 'undefined'!==typeof $.WebfanDesktop.Registry.User && null!==$.WebfanDesktop.Registry.User) ? $.WebfanDesktop.Registry.User.token : '';
    
 
    if('undefined' !== typeof options){
		$.extend(this,options);
	}
	
     	 
    $(this).Ptty({
    	theme : 'default',
        welcome: 'frdl:\/\/>',
        
            autocomplete : true,
            
            history      : true,
            
            history_max  : 800,
             
            charset      : 'UTF-8',
             
            enctype      : 'multipart/form-data',
             
            autofocus    : true
    });
     var shebang = '#!';
     var by = 'Good by!';
   /*  var URI_RPC = 'jsonrpc/remote.json'; */
   
  
     
	 var banner = [
'************************************************************',   
'FRDL Terminal v3.0.2                                        ',
'Copyright (c) 2015 Till Wehowski [frdl.de]                  ', 
'based on Ptty [code.patxipierce.com]                        ', 
'DESKTOP powered by [github.com/nathansmith/jQuery-Desktop]  ',
'************************************************************'].join('\n') + '\n';
			 
		
	var THIS = this;	
		
	var clisetup = require('http://'+frdl.route('HOST_CDN_PUBLIC_FRDL')+'/cdn/frdl/flow/components/webfan/cli/clisetup/clisetup');
		
	$(THIS).data('url1', frdl.route('API_JSONP') );	
	$(THIS).data('url2', frdl.route('API_CLIENT_URL') );		
			 
	var getUrl = function(wich){
	  wich=wich.toString();
	  var m='url';
	  	
	  switch (wich){
	  	  case '1' :
	  	      /* m = 'url1'; */
	  	      return frdl.route('API_JSONP');
	  	    break;
	  	  case '2':
	  	     /*  m = 'url2'; */
	  	      return frdl.route('API_CLIENT_URL');
	  	    break;  
	  	  default:
	  	        return frdl.route('API_JSONP');
	  	     break;
	  	    
	  }	
	  return $(THIS).data(m)
	}; 
			 
			 
			 
    $.register_command(
        'about',
        'About frdl Terminal.',
        'about [no options]',
        function(){
            var about = banner;
      
            return {
                type : 'print', 
                out : about
            };
        }
    );
    $.register_command(
        shebang + 'test', 
        'Testsuite',
        shebang + 'test [mixed]',
        {
            ps : shebang + 'test',
            start_hook      : function(){ 
                return {
                    type : 'print',
                    callback : 'typewriter',
                    out : 'Mock interface, for developers only!',
                    write : 'Do your tests...'
                };
            },
            exit_hook   :    function(){
                        	               var BY = by;
                                           return { 
                                                     type : 'print',
                                                     out : BY
                                                  };
                                          },
            dispatch_method : function(args){
                return {
                    type : 'print',
                    callback : 'test',
                    out : '',
                    write : args
                };
            }
        }
    );
   
        
      var stripQuotes = function(a) {
            if ((a.charAt(0) === '"' && a.charAt(a.length-1) === '"')
             || a.charAt(0) ===  "'" && a.charAt(a.length-1) === "'") {
                 return a.substr(1, a.length-2);
            }
           return a.trim();
       };
       var http_status_string = function(code){
       	    code = parseInt(code);
       	    
	   	      switch(code){
	   	      	      case 200 : 
	   	      	           return 'Ok';
	   	      	         break;   
	   	      	      case 201 : 
	   	      	           return 'Created';
	   	      	         break;   
	   	      	      case 304 : 
	   	      	           return 'Not Modified';
	   	      	         break;   
	   	      	      case 400 : 
	   	      	           return 'Bad Request';
	   	      	         break;   
	   	      	      case 401 : 
	   	      	           return 'Unauthorized';
	   	      	         break;   
	   	      	      case 403 : 
	   	      	           return 'Forbidden';
	   	      	         break;   
	   	      	      case 404 : 
	   	      	           return 'Not Found';
	   	      	         break;   
	   	      	      case 409 : 
	   	      	           return 'Conflict';
	   	      	         break;   
	   	      	      case 455 : 
	   	      	           return 'Blocked Due To Misbehavior';
	   	      	         break;   
	   	      	      case 500 : 
	   	      	           return 'Internal Server Error';
	   	      	         break;   
	   	      	      case 501 : 
	   	      	           return 'Not Implemented';
	   	      	         break;   
			  	      default:
			  	           return'undefined error';
			  	       break;  
			  }
	   };
      $.register_command(
            'search',
            'Do a Webfan.de search.',
            'search [ searchterm ]',
            function(tokens) {
                var t = [];
               if('search' !== tokens.shift()){
			   	 var msg = 'Unexpected error in console.search!';
			   	 console.error(msg);
			   	 alert(msg);
			   	 return ;
			   }
			   
               var cmd = tokens.join(' ').trim();
		        var q = ('string' === typeof tokens[1]) ? tokens[1] : null;
               
                frdl.wd().Registry.Programs['search'].cb_open({
                	     query : urlencode(cmd)
                	});
               
               
                $('<div></div>').appendTo('.cmd_terminal_content').html('Search on ' + q + ' opened...');
                	   
                return;
            }
        );
      $.register_command(
            'webfan',
            'webfan command',
            'webfan [ arguments ]',
            function(tokens) {
                var t = [], cmd = tokens.join(' ').trim();
                 frdl.c(cmd, function(err, data){
 	               if(err){ 	 	
	 	             $('.cmd_terminal_content').append('<div style="color:red;">'+err+'</div>');
	 	            return;
	                }
	                    var util = require('util');      
		                $('.cmd_terminal_content').append('<div><pre>'+util.inspect(data)+'</pre></div>');
	 
                  }, true, frdl); 
 	                    	   
                return;
            }
        );
        
        
        
        
        
        
       frdl.each(clisetup.sqlstarts, function(i, c){
	     function reg(command){
	      $.register_command(
            command,
            'sql command -' +command + '-',
            command + ' [ ...rest of sql query ]',
            function(tokens) {
                  var sql_query = tokens.join(' ').trim();
  
                  var promise = frdl.sql.query(sql_query, function(err, resultset) {
                  	         if (err) {
                  	         	     $('<div></div>').appendTo('.cmd_terminal_content').html('Error: #' + err );  
                                    if(0<frdl.debug.mode())console.error(err);
                              } else {
                              	
                                   $('.cmd_terminal_content').append('<div>!#sql:> "'+sql_query+'"</div>');
                                   $('.cmd_terminal_content').append('<div>'
                                           + require('util').inspect(resultset, {
 	                                                showHidden : true,
 	                                                depth : 8
 	                                        })
 	                                      +'</div>'
 	                               );
                               }
                        });
               return;
            }
           );		 	
		 }
	     
          reg(c);
   	      reg(c.toUpperCase());
	   });
           
       $.register_command(
            'frdl',
            'Send frdl command to an selected endpoint.',
            'frdl [ mixed ]'  + "\n" 
                 + "\tResponse types  e.g.:\n"
                 +"\t\t--expect=json\n"
                 +"\t\t--expect=jsonp\n"
                 
                 
                 + "\tFlags:\n"
                 +"\t\t-b send to client API\n"
                 +"\t\t-d debug messages on\n"
                 +"\t\t-t testrequest\n"
                 
                  
                 + "\tExample:\n"
                 +"\t\tfrdl help -b\n"
                 +"\t\tfrdl help --expect=json\n"
            ,
            function(tokens) {
  
            	var cache = false;
            	var url = getUrl(1);
            	var i = 0, j, u, expect = 'jsonp', method = 'GET';
                var out = '', debug = false, quiet = false, typeOut = 'print', preparse = false;
                var k,toks,cmd = tokens.join(' ').trim(), kvp, _data = {}, _jsonpCallback = 'frdlBounce';
                var tokens = [], test = false;
                var toks = clisetup.parseArgs(cmd, true);
                for(i in toks){
       	             tokens.push(toks[i]);
				}
	
					    
	            for(i = 0; i < tokens.length; i++){
  					 if(   '-' === tokens[i].substr(0 , 1) 
  					    && '--' !== tokens[i].substr(0 , 2) 
  					    && tokens[i].length > 2 ){
  						 for(j = 1; j < tokens[i].length; j++){
						 	tokens.push('-' + tokens[i][j]);
						 }  
						 tokens[i] = '';
					 }                	
                }				
        
				
							
	            for(i = 0; i < tokens.length; i++){		
	               if('' === tokens[i])continue;
	             
                    tokens[i] = stripQuotes(tokens[i]);	
	                              	
                    if('preparse' === tokens[i] || '-p' === tokens[i]){
				    	preparse = true;
				    }              	
                    if('bounce' === tokens[i] || '-b' === tokens[i]){
                    	url =   getUrl(2);	
				    
				    }
	                if('debug' === tokens[i] || '-d' === tokens[i] || ('undefined'!==typeof frdl.wd().o && true === frdl.wd().o.debug)){
				    	debug = true;
				    	
				    }			    
	                if('quiet' === tokens[i] || '-q' === tokens[i]){
				    	quiet = true;
				    }	 
	                if('test' === tokens[i] || '-t' === tokens[i]){
				    	test = true;
				    }	
				    	
                  if(true === new RegExp("\=").test(tokens[i])){
						 kvp = explode('=', tokens[i], 2);
                         kvp[1] = stripQuotes(kvp[1]);
 
                   
						 if('--' === kvp[0].substr(0 , 2) ){
						 	kvp[0]=kvp[0].substr(2 , kvp[0].length);
						 }
						 
						 
						  _data[kvp[0]] = kvp[1];
						  
						  
						  
						 if(  'POST' === kvp[0] 
						   || 'GET' === kvp[0]
						   || 'PUT' === kvp[0] 
						   || 'DELETE' === kvp[0]
						   || 'HEAD' === kvp[0]){
						 	 method = kvp[0];
						 	 url =  kvp[1];
						 }
						 
						
						 if('callback' === kvp[0]){
						 	 _jsonpCallback = kvp[1];
						 }
						
						if('expect' === kvp[0]){
						 	 expect = kvp[1];
						 }					 
						
						if('method' === kvp[0]){
						 	 method = kvp[1];
						 }							 
					}else{
						 if('-' === tokens[i].substr(0 , 1) ){
						 	tokens[i]=tokens[i].substr(1 , tokens[i].length);
						 }
						 _data[tokens[i]] = true;
					}
				}
				
       
				
				if(expect === 'jsonp'){
					method = 'jsonp';
				}
		
     			
				              
                var result = { type : typeOut, out : out, quiet : quiet };
                $.set_command_option({cmd_quiet: quiet});
                
                var _DATA = _data;
                if(true !== preparse)_data = {};
                if(expect === 'jsonp')_data.callback = _jsonpCallback;  
                
                $.extend(_data, {
                        	     cmd: ('GET' === method) ? urlencode(cmd) : cmd,
                        	     token : THIS.user_token,
                        	   /*  cmd_tokens: tokens, */
                        	     frdlcmd : tokens[1],
                        	     target_url : getUrl(2)
                        	  });
                
              if('jsonp'===method){
			  	u = frdl.Url(url);
			  	frdl.each(_data, function(k,v){
			  		u.setParam(k,urlencode(v));
			  	});
            	frdl.getScript(u.urlMakeNew(), function(){},false,false);
			  	return;
			  }
                  
                  
              $.ajax({
                        url: url,     
                        crossDomain: true,
                        type: method,  
                        /*
                        jsonpCallback: _jsonpCallback,  
                        jsonp: _jsonpCallback,
                        */
                      /*  jsonp: false,*/
                        jsonp: "callback", 
                        jsonpCallback: _jsonpCallback,   
                        dataType: expect, 
                        data: _data,
                        beforeSend : function( jqXHR, settings){
                	    if(true === test || true === debug){
					 	var _out = 'Sending: '+ JSON.stringify(_data) +' :> '  
							   + method + ' ' + url +' :> ' 
							   + '--PARSE [CMD] :> '
							   + JSON.stringify(_DATA) + ' :> ' 
							   + ' --ABORTED [TEST]' + ' :> --DEBUG [REQUEST] :>'
							   + JSON.stringify(jqXHR) +'  --DEBUG [SETTINGS] :> ' 
							   + JSON.stringify(settings)							   
							   ; 
						$('<div></div>').appendTo('.cmd_terminal_content').html(_out); 
							   
					 	if('undefined' !== typeof _DATA.test && 'response' !== _DATA.test ){
					 		return false;
                        }else{
							/*  return true; */
						}			 		
					    }else{
							/*  return true; */
						}	
                    },
                    
                    cache: cache
                        
                }).done(function( response ) {
        
                	
                	     if('undefined' !== typeof $.WebfanDesktop.o){
						 	$.WebfanDesktop.o.$  = response;
						 }
                	        
                	        var _out = '';
                              result = $.extend(result, response);  
                            
                              
                             if('string' === typeof response.cmd){
                             	try{
							 	  $.cliExec(response.cmd);
							 	  }catch(err){
								      console.error(err);
							     }	
							 } 
			
							
							try{
							 if('function' === typeof response.callback){
							 	 response.callback(response);
							 }else if('string' === typeof response.callback && 'function' ===  window.document[response.callback] ){
							 	 window.document[response.callback](response);
							 }							
							}catch(err){
								console.error(err);
							}		 
                             if('string' === typeof response.js){
                             		try{
							 	         window.eval(response.js);
							 	      }catch(err){
								          console.error(err);
							         }	
							 } 	
							 						
							 if(true === debug && 'array' === typeof response.log){
							 	for(var i = 0; i < response.log; i++){
									 $('<div class="webfan-red"></div>').appendTo('.cmd_terminal_content').html(
									     'Error #' + response.log[i].code + ': ' + response.log[i].message
									 );
								}
							 }						
							 			
							 							 
							 if(true === debug)_out += ((true===debug) ? 'Sending: '+ JSON.stringify(_data) +' :> '  : ' :> ')
							   + method + url +' :> ' 
							   + JSON.stringify(response);
							/* alert(JSON.stringify(response));  */
							 
							 
							 if(true !== quiet){
							 	if('string' === typeof response.out){
							 		_out += '<p>' + response.out + '</p>';
							    }else{
									_out+= JSON.stringify(response);
								}		
							 }S//else if(true === debug){
							 //	_out += ' - Debuginfo: Output none verbose option enabled -';
							// }
							 
						//	if(true === debug || true !== quiet){
					
								 $('<div></div>').appendTo('.cmd_terminal_content').html(_out); 
						//     }
							 
							 
							 
							 
							 $('.cmd_terminal_prompt').show();
                 }).fail(function(jqXHR, textStatus ) {
                 	      $('<div></div>').appendTo('.cmd_terminal_content').html(frdl.debug.last());      
                 	       if('undefined' !== typeof $.WebfanDesktop.o && 'undefined' !== typeof $.WebfanDesktop.o.$)$.WebfanDesktop.o.$  = null; 
                           $('<div></div>').appendTo('.cmd_terminal_content').html('Error: #' + jqXHR.status + ' ('+http_status_string(jqXHR.status)+')'  + ' - ' + textStatus );
                         	if(true === debug){
								 $('<div></div>').appendTo('.cmd_terminal_content').html(JSON.stringify(jqXHR)); 
						     }  
							 $('.cmd_terminal_prompt').show();
             }).always(function( ) {
                 	 
             });
                
                
                return result;
            }
        );
    
    /*
    
     $.register_callback('test', function(data){
    	 try{
                $('<div></div>').appendTo('.cmd_terminal_content').html('Input: ' + JSON.stringify(data.write));
           }catch(err){
             	throw( settings.error_prefix + ' ' + err );
           }
           
           $('<div></div>').appendTo('.cmd_terminal_content').html('Run test...'); 
    });
    */
    
       
   /**
    $.register_command(
        'date',
        'returns the current date',
        'date [no options]',
        function(){
            var now = new Date();
            return {
                type : 'print', 
                out : now + ' '
            };
        }
    );
*/
    $.register_command(
        shebang + 'js', 
        'Execute command line as javascript.',
        shebang + 'js [javascript]',
        {
            ps : shebang + 'js',
            start_hook      : function(){ 
                return {
                    type : 'print',
                    callback : 'typewriter',
                    out : 'Execute command line as javascript.',
                    write : 'Type in some javascript contents to execute in your browser...'
                };
            },
            exit_hook       : function(){
                        	               var BY = by;
                                           return { 
                                                     type : 'print',
                                                     out : BY
                                                  };
                                          },
            dispatch_method : function(args){
                return {
                    type : 'print',
                    callback : 'javascript',
                    out : '',
                    write : args.join(' ')
                };
            }
        }
    );
    $.register_command(
        shebang + 'write', 
        'Type into terminal screen.',
        shebang + 'write [html]',
        {
            ps : shebang + 'write',
            start_hook      : function(){ 
                return {
                    type : 'print',
                    callback : 'typewriter',
                    out : 'Type into terminal screen.',
                    write : 'Type in some (HTML) contents to display in terminal screen...'
                };
            },
            exit_hook       : function(){
                        	               var BY = by;
                                           return { 
                                                     type : 'print',
                                                     out : BY
                                                  };
                                          },
            dispatch_method : function(args){
                return {
                    type : 'print',
                    callback : 'typewriter',
                    out : '',
                    write : args.join(' ')
                };
            }
        }
    );
    $.register_callback('jexe', function(data){
    	 try{
               if(data.write && '' !== data.write)window.eval(data.write);
           }catch(err){
             	throw( settings.error_prefix + ' ' + err );
           }
    });
    
    $.register_callback('javascript', function(data){
    	 try{
            $('<div></div>').appendTo('.cmd_terminal_content').html(window.eval(data.write));
           }catch(err){
           	   $('<div></div>').appendTo('.cmd_terminal_content').html(err);
               /*	throw( settings.error_prefix + ' ' + err );  */
           }
    });
    
      
    $.register_callback('typewriter', function(data){
        var text_input = $('.cmd_terminal_prompt');
        text_input.hide();
        if(typeof data.write === 'string'){
           
            var str = $('<div/>').html(data.write + ' ').text(),
            typebox = $('<div></div>').appendTo('.cmd_terminal_content'),
            i = 0,
            isTag,
            text;
            (function typewriter() {
                text = str.slice(0, ++i);
                if (text === str) return text_input.show();
                typebox.html(text);
                var char = text.slice(-1);
                if( char === '<' ) isTag = true;
                if( char === '>' ) isTag = false;
                if (isTag) return typewriter();
                setTimeout(typewriter, 10);
            }());
        }
    });
 
    	
      /* $(this).Ptty(); */
       return this;
    };
 
});
 |