Suagencia.Classes.TwitterTemplate = Class.create( {
	initialize: function ( obj, vOptions ) {
		this.id = $(obj).identify();
		
		if( vOptions )
			{this.Options = Suagencia.TwitterTemplates.defaultOptions.merge(vOptions)}
		else
			{this.Options = Suagencia.TwitterTemplates.defaultOptions.clone()}
		
		this.firstRequest = false
		Suagencia.TwitterTemplates.items.set( this.id , this );
		this.funcName = "twtCB_" + this.id
		this.dataSource = "http://twitter.com/statuses/" +  this.Options.get("method") + "/" + this.Options.get("user") + ".json?callback=" + this.funcName
			
	},
	requestData: function() {
		var vFuncName = "twtCB_" + this.id
		var vHEAD = document.getElementsByTagName("head")[0];

		if( ! window[this.funcName])
		{
			var func = new Element("script")
			func.update( "function " + this.funcName + "( vResponse ) { Suagencia.TwitterTemplates.items.get('" + this.id + "').setAjaxData( vResponse )}" );
			vHEAD.insert( func );
		}

		vHEAD.insert( new Element( "script" , {"src":this.dataSource} ) );
	},
	_firstRequest: function(){
		if( !this.firstRequest ) {
			this.firstRequest = true;
			this.requestData();
		}
		
	},
	setAjaxData:function(vResponse) {
			var rawData = vResponse;
			var userData = new Array();
			var tweetData = new Array();
			var vParseLink = this.Options.get("parseLink");
			var vValue;
			
			for( i = 0 ; i < rawData.length ; i ++ ) {
				userData.push( rawData[i].user );
				
				rawData[i].user = null;
				if( vParseLink )	{
					vValue = rawData[i].text.toString();
					vValue = vValue.replace(/(\s|^)(http:\/\/|#|@)\S*/ig , Suagencia.TwitterTemplates.parseLinks);					
					rawData[i].text = vValue;
				}
				rawData[i].created_at = Suagencia.TwitterTemplates.configDate( rawData[i].created_at , this.Options.get("dateformat") );
				tweetData.push( rawData[i] );
			}
			this.userData = userData;
			this.tweetData = tweetData;
			this.draw()
	},
	draw: function() {
		var vElement = $(this.id);
		vElement.update();
		var vResult;
		var vUserTemplate;		
		var vTweetTemplate = new Template( this.Options.get("template") , /(^|.|\r|\n)(#tweet_(\w+)#)/);
		
		for( i = 0 ; i < this.tweetData.length ; i ++ ) {
			vResult = vTweetTemplate.evaluate( this.tweetData[i] );
			vUserTemplate = new Template( vResult , /(^|.|\r|\n)(#user_(\w+)#)/ );
			vResult = vUserTemplate.evaluate( this.userData[i]  );
			vElement.insert( vResult );
		}
		//Suagencia.draw( null, vElement );
		vElement.fire("suag:twitterLoaded");
	}
	
});

Suagencia.TwitterTemplates = {
	items:new Hash(),
	parseLinks: function ( vString ) {
		var addchar = ""
		if( vString.charAt(0) == " " )
			{vreplacetext = vString.slice(1); addchar = " "}
		else
			{vreplacetext = vString.slice(0);}
			
		if(vreplacetext.charAt( 0 ) == "h" )
		 { return addchar + "<a target='blank' class='twitter_externalLink' href='" + vreplacetext + "'>" + vreplacetext + "</a>"}
		 
		if(vreplacetext.charAt( 0 ) == "#" )
		 { return addchar + "<a target='blank' class='twitter_trendTopic' href='http://twitter.com/search?q=%23" + vreplacetext.slice(1) + "'>" + vreplacetext + "</a>"}
		 
		 if(vreplacetext.charAt( 0 ) == "@" )
		 { return addchar + "@<a target='blank' class='twitter_userName' href='http://twitter.com/" + vreplacetext.slice(1) + "'>" + vreplacetext.slice(1) + "</a>"}
		 
	},
	defaultOptions: $H({method:'user_timeline',parseLink:true,dateformat:"dd, mmm yyyy"}),
	config:function( event , vDOM)
	{
		if( vDOM )
			{allBarras = $(vDOM).select("*[suag:objeto~=twitterTemplate]");}
		else
			{allBarras = $$("*[suag:objeto~=twitterTemplate]");}
		
		allBarras.each( function (myPainel , i) {
			var vOptions = null;
			if (myPainel.readAttribute("suag:twitterParam"))
				{var vOptions = $H(myPainel.readAttribute("suag:twitterParam").evalJSON());}
			else
				{vOptions = new Hash}
			
			vOptions.set("template" , myPainel.innerHTML )
			myPainel.update();
			new Suagencia.Classes.TwitterTemplate( myPainel , vOptions );
		})
	},

	configDate: function( pDate , vformat ){
		var dateArray = pDate.split(' ');
      	var vDate =  new Date(
          Date.parse( dateArray[0] + ', ' + dateArray[2] + ' '
             + dateArray[1] + ' ' + dateArray[3] + ' '
             + dateArray[5].substring(0,4) )
        );

		return vDate.format( vformat )
	},

	changeDefaultOptions: SuagenciaFramework.changeDefaultOptions
}