/**
 * 
 *
 */
var DAPI_ENV = 'http://v1.d-api.de/index/alltables.env';
var DAPI_URL = "http://v1.d-api.de/";
var DAPI_WIKI_ROOT = "/Api:";
var DAPI_YQL_NAMESPACE = "d-api.";
var ControllerLIMITS = {
	"global": 1,
	"parlament.bund.politiker": 2,
	"parlament.bund.wahlkreise": 5,
	"parlament.bund.wahlkreise.ortsdaten": 10,
	"parlament.bund.petition": 2,
	"parlament.bund.petition.menschen": 10,
	"parlament.bund.petition.mitzeichner": 10
};
var ControllerQ = {
	"parlament.bund.wahlkreise": {
		'plz': '13189'
	},
	"parlament.bund.wahlkreise.ortsdaten": {
		'id': '001'
	},
	"parlament.bund.wahlkreise.geodaten": {
		'id': '001'
	},
	"landtag.nrw.wahlkreise": {
		'ort': "Wuppertal"
	},
	"landtag.nrw.wahlkreise.geodaten": {
		'ort': "Wuppertal"
	}
}
var dapi = function ( baseUrl, apikey ) {
	var self = this;
	this.apikey = apikey || null;
	this.baseUrl = baseUrl || DAPI_URL;
	
	this.get = function( path, cb, params ) {
		params = params || {}
		params['output_type'] = 'jsonp';
		$.ajax( {
			'cache': true,
			'url': this.baseUrl + path,
			'dataType': 'jsonp',
			'data': params,
			'success': cb
		} );
		return self;
	}
	
	this.bridge = function( path, cb, params ) {
		params = params || {}
		//params['output_type'] = "xml";
		$.ajax( {
			'cache': true,
			'url': './bridge.php',
			'dataType': 'text',
			'data': {
				'url': this.baseUrl + path + "?" + jQuery.param( params ),
				'output_type': params['output_type']
			},
			'success': cb
		} );
		return self;
	}
	
}

$( function(){
	var val1,val2,val1_,val2_,
		t1=$('#d-api-test-rest-console-rest'),t2=$('#d-api-test-yql-console'),
		t3=$('#d-api-test-yql-rest-console'),
		tc=$('#api-controller'),
		yqlOpener=$('#yql-opener'),
		yqlOpenerRaw=$('#yql-opener-raw'),
		apiOpenerRaw=$('#api-opener-raw'),
		c =$('#yui-main .yui-b'),OUTPUT_TYPE="xml";
	
	
	var d = new dapi();
	
	function loading( conttrollerName, params ){
		c.html('Laden des Requests ('+conttrollerName+')..');
	}
	function changefrom( YQL, REST ) {
		if( YQL ) {
			//var table = YQL.find( /Select[\w\W]+?FROM[\s]*[\w\.\d]+?[\s]+/gmi );
			//var Query = YQL.find( /WHERE[\s]*[\w\.\d]+?[\s]+/gmi );
		}
		if( REST ) {
			
		}
	}
	/*
	$('#d-api-test-rest-console-rest,#d-api-test-yql-console').change( function(){
		val1_ = t1.val();
		val2_ = t2.val();
		console.log( val1_, val2_ );
		if( val1_ !== val1 ) {
			val1 = val1_;
			changefrom( undefined, val1 );
		}
		if( val2_ !== val2 ) {
			val2 = val2_;
			changefrom( val2, undefined );
		}
	} );
	*/
	function paramize( obj ){
		var q = [],k;
		for( k in obj ) {
			if( String( obj[k] ).length < 1 ) continue;
			if( String( k ).length < 1 ) continue;
			q.push( k +"="+obj[k] );
		}
		return q.join("&");
	}
	function checkParamize( obj ) {
		var q = {},k;
		for( k in obj ) {
			if( String( obj[k] ).length < 1 ) continue;
			if( String( k ).length < 1 ) continue;
			q[k] = obj[k];
		}
		return q;
	}
	function showController ( controllerName, params ) {
		params = checkParamize( params || {} )
		controllerName = controllerName.split('/')[0];
		if( params['output_type'] == undefined )
			params['output_type'] = OUTPUT_TYPE;
		if( params['limit'] == undefined ) {
			params['limit'] = String( ControllerLIMITS[controllerName] ? ControllerLIMITS[controllerName] : ControllerLIMITS["global"] );
			if( ControllerQ[controllerName] !== undefined ) {
				for(var k in ControllerQ[controllerName] ) {
					params[k] = ControllerQ[controllerName][k];
				}
			}
		}
		var OutputType = params['output_type'];
		loading( controllerName, params );
		//console.log( params )
		d.bridge( controllerName, function( data ) {
			if( data.length > 8000 ) {
				data  = data.slice( 0, 8000 ) + "</pre>"+
					"\n\t...( aus Anzeige Gründen wird hier abgeschnitten )...\n<pre style='display:none'>";
			}
			c.empty( );
			var name = 'code'+(new Date).getTime();
			c.html( "<textarea name='"+name+"' class='"+( OutputType || OUTPUT_TYPE )+"'>"+data+"</textarea>" );
			dp.sh.HighlightAll( name );
			reloadHeight();
			window.setTimeout( reloadHeight, 1000 );
		}, params );
		
		t1.val( d.baseUrl + controllerName + "?" + paramize( params ) );
		apiOpenerRaw.attr('href', d.baseUrl + controllerName + "?" + paramize( params ) );
		var YQL = "SELECT * FROM " + DAPI_YQL_NAMESPACE + controllerName.split('/')[0];
		delete params['output_type'];
		var k, ks=[],kL="";
		for( k in params ) {
			if( k == 'limit' ) {
				k1 = params[k].split(',')
				if( k1.length == 1 ) kL = " LIMIT " + k1[0]
				else kL = " LIMIT " + k1[1] + " OFFSET " + ( parseInt( k1[0] ) + 1 ); 
			}
			else ks.push( k + " = \"" + params[k] + "\"" );
		}
		if( ks.length > 0 ) {
			YQL += " Where " + ks.join(' and ');
		}
		YQL += kL;
		var t = paramize( {
			'q': YQL,
			'env': DAPI_ENV
		} );
		yqlOpener.attr( 'href', "http://developer.yahoo.com/yql/console/?" + t );
		t2.val( YQL );
		t3.val( "http://query.yahooapis.com/v1/public/yql?" + t );
		yqlOpenerRaw.attr( 'href', "http://query.yahooapis.com/v1/public/yql?" + t );

	}
	
	t1.keydown( function( event ){
		if( event.keyCode == 13 ) {
			event.preventDefault();
			val1_ = t1.val();
			var b = val1_.replace( d.baseUrl, '' ).split('?'),p={};
			if( b[1] ) {
				b[1] = b[1].split('&')
				jQuery.each( b[1], function(i, B ){
					B = B.split('=');
					p[B[0]]=B[1];
				} );
			}
			//console.log( b[0], p );
			showController( b[0], p );
			return false;
		}
	} );
	var lastt1timeout=null;
	/*t1.keyup( function( event ){
		window.clearTimeout(lastt1timeout);
		lastt1timeout = window.setTimeout( function(){
			
		}, 500 );
	} );*/
	var lastActiveController = "";
	window.getLastDApiController = function(){
		return lastActiveController;
	}
	window.getLastDApiControllerWikiPage = function(){
		return DAPI_WIKI_ROOT + lastActiveController;
	}
	d.get( 'index/help.controller', function( response ) {
		if( response.code == 200 ) {
			$.each( response.data, function( i, controller ) {
				$('<li class="'+controller.replace(/([^\w])/gmi,'_')+'"><a href="#show.'+controller+'">'+controller+'</a><div class="more-info"></div></li>').appendTo( tc ).click( function(){
					if( lastActiveController == controller ) return;
					lastActiveController = controller;
					var _that = $(this);
					tc.find('.more-info').empty();
					_that.find('.more-info').html('Es werden mehr Informationen geladen..');
					showController( controller );
					tc.find('li').removeClass('active');
					_that.addClass('active');
					d.get( controller + "/help.fields", function( data ) {
						if( data.error || !data.data ) {
							_that.find('.more-info').html('Uuups ein Fehelr ist augetreten.');
						} else {
							var html = "<h4>"+data.data.length+" verfügbare Felder:</h4><ul>";
							jQuery.each( data.data || {}, function( i, name ) {
								html += "<li>"+name+"</li>";
							} );
							html += "</ul>";
							html += "<h4 class='to-wiki-page'><a target=\"_blank\" href=\""+window.getLastDApiControllerWikiPage()+"\">zur Wiki-Seite</a></h4>";
							_that.find('.more-info').html( html ).find('li').click( function(){
								var val = t1.val();
								if( val.indexOf('?') == -1 ) val += "?"+$.trim( $(this).html() )+"=";
								else val += "&"+$.trim( $(this).html() )+"=";
								t1.val( val );
								t1.focus();
							} );
						}
					} );
				} );
			} );
			if( window.location.hash.length > 5 ) {
				var method = window.location.hash.replace('#show.','');
				tc.find('li').removeClass('active');
				$('li.'+method.replace(/([^\w])/gmi,'_')).click();
			}
		}
	} );
	
} );

