/**
* Teeko Framework AJAX Javascript library
*
* @copyright (C) 2009 Webisti Oy. All rights reserved
* @version 1.0
* @author Tomi Tuovinen <tomi.tuovinen@webisti.fi>
*/

var XHR;

function Cursor(pointer)
{
/*
	try
	{*/
		document.body.style.cursor = pointer;
	/*}
	catch(ex)
	{}*/
}

function Refresh(dest)
{
	var lastAction = $("#"+dest).data('lastaction');
	var lastArgs = $("#"+dest).data('lastargs');

	Request(lastAction, {'dest':dest, method:'post'}, lastArgs );
}

function includeJS(id, script)
{
	if(document.getElementById(id)) return false;
	var oHead = document.getElementsByTagName('HEAD').item(0);
	var oScript = document.createElement( "script" );
	oScript.language = "javascript";
	oScript.type = "text/javascript";
	if(id !== false) oScript.id = id;
	oScript.defer = true;
	oScript.text = script;
	oHead.appendChild( oScript );
}


function Request(act, parms, args, additional_args, returnXHR)
{
	// Force Change hash cause otherwise visitor clicks link and hash change thinks that
	// history used and it double click link.
	// And timeout 100 that hash is changed before force

//	hash.clicked();
	/*
	if(editor.exists() !== false)
	{
		session.reset();
	}
	*/
	if(act === undefined) return false;
			
	var args_str = "";
			
	if(typeof parms === 'string') parms = eval('(' + parms + ')');

	if(typeof args === 'string')
	{
		// Check if it is json array
		if(args.substring(0,1) == '{' && args.substring(args.length-1,args.length) == '}')
		{
			args = eval('(' + args + ')');
		}
		else if($('#'+args).length > 0)
		{
			$args = $('#'+args);
			
			args = ($args.attr('tagName') == 'FORM') ? $args.serializeArray() : '{"'+$args.attr('name')+'":"'+$args.attr('value').replace(/(\")/g, '&#8221;').replace(/<(.|\n)*?>/g, '')+'"}';
			/*
			if($args.attr('tagName') == 'FORM')
			{
				args = $args.serializeArray();
			}
			else
			{
				args = '{"'+$args.attr('name')+'":"'+$args.attr('value').replace(/(\")/g, '&#8221;').replace(/<(.|\n)*?>/g, '')+'"}';
			}
			*/
		}
	}
	
	if(parms !== undefined)
	{
		var smethod = parms['method'];
		var destination = parms['dest'];
		var append = parms['append'];
		var get_dataType = parms['datatype'];
		var vasync = parms['async'];
		var abort = parms['abort'];
	}
	
	if(smethod === undefined) var smethod = 'get';
	
	if(!get_dataType) get_dataType = 'html';

	if(abort === true && typeof XHR !== 'undefined' && XHR !== null)
	{
		XHR.abort();
		XHR = undefined;
	}
	if(/*$(document).data('preloader') !== undefined && */typeof XHR !== 'undefined' && XHR !== null)
	{
		// DEBUG: Ei voi tehdä kahta loaditemii esim. showssa kun toinen aborttaa toisen
//		XHR.abort();
  //  	XHR = undefined;
  
  
		// DEBUG: Tässä tulee virhe jostain syystä!! mutta pitää laittaa toimimaan
		//$(destination).preloader();
	}

	
//	$("#"+destination).data('lastaction', act);
//	$("#"+destination).data('lastargs', args);

	/*try
	{*/
		if(typeof additional_args === 'object')
		{
			$.each(additional_args,function(i,item) 
			{		
				args[args.length] = item;
			});
		}

	
		if(typeof args === 'object')
		{
			//Check is values element id's and change value
			
			$.each(args,function(i,item) 
			{	
				if(typeof item !== 'undefined') if(item[0] == '#' && $(item).length > 0) args[i] = $(item).attr('value');
			});
			args = JSON.stringify(args);
		}
		
		if(typeof args !== 'undefined')
		{
			args_str = "args=" + encodeURIComponent(args);
		}
		
		var arrHash = hash.current();

		if($.isArray(arrHash)) var arrStr = arrHash.join('/');
		
		if(arrStr) args_str += "&test="+arrStr;


		var arrpHash = hash.previousHash();

		if($.isArray(arrpHash)) var arrpStr = arrpHash.join('/');
		
		if(arrpStr) args_str += "&test2="+arrpStr;

		var surl = "";
		
		
		var surl = (act.indexOf('http://') == -1) ? '/template/'+act : act; 
/*		{
			surl = '/template/'+act;
		}
		else
		{
			surl = act;
		}
*/

		var success_function = function(data, status) 
    	{    	
       		try
    		{
    			if(data === '') return false;

			    var data = (typeof data === 'object') ? data : eval('(' + data + ')');

				if($('.teeko-page-preloader').length > 0) $('.teeko-page-preloader').hide();
				
				if(typeof data === 'object')
				{
					if(data.destination !== null) destination = data.destination;

					if($(destination).length > 0 && typeof destination !== 'undefined')
					{
							if(data.css == undefined) data.css = '';
							if(data.html == undefined) data.html = '';
							
							if(data.append == 'true') append = 'true';

							if(append !== 'true' && data.show =='fade')
							{
								//if (!$.browser.webkit) {
									if ( $.browser.msie ) 
									{
										//$(destination).find('*').remove();
										$(destination).empty();
									}
									else
									{
										$(destination).find('[teeko-element-type=nivoslider]').remove();
										$(destination).find('[teeko-element-type=gallery]').remove();
										$(destination).wrapInner("<div class='teeko-page-fader'/>");
									
										$('.teeko-page-fader').fadeOut(1000, function() { $(this).remove(); });
									}
							}
							else if(append !== 'true') $(destination).empty();
							//else if(append !== 'true') $(destination).find('*').remove();
							
							//if(append !== 'true') $(destination).find('*').remove();

							if($(data.element).length > 0)
							{
								$(data.element).remove();
							}
							$(destination).append(data.css + data.html).show();
							
							if(append !== 'true') $(destination).scrollTop(0);

							if(data.scrollto) $('body').scrollTo(data.scrollto,200);
							
							if(data.element && data.show)
							{
								if(data.show =='fade')
								{
									//if (!$.browser.webkit) {
									
									if ( $.browser.msie ) 
									{
										
									}
									else
									{
										$(data.element).not('[teeko-element-type=nivoslider]').not(':hidden').hide().fadeIn(1000);
									}
									/*}
									else
									{
									}*/
								}
								else
								{
									//if (!$.browser.webkit) {
										$(data.element).hide().delay(300).show(data.show,{},1000);
								//	}
								}
							}

							if(data.js_classes !== null)
							{
								$.each(data.js_classes,function(i,item)
								{
									/*if(item.length > 0) */includeJS('external_class_'+i, item);
								});	
							}

							if(data.js_files !== null)
							{
								$.each(data.js_files,function(i,item)
								{
									/*if(item.length > 0) */includeJS(false, item);
								});	
							}
							
							includeJS(false, data.js_events);

							// CHECK ANCHOR and scroll to it
							var anchor = hash.anchor();							
							if(typeof anchor !== 'undefined') 
							{
								var pos = $('[name='+anchor+']').offset().top;
								var anchor_target = $('[name='+anchor+']').attr('parent');
								
								$(anchor_target).scrollTop(pos);
							}
						
						// If element has class teeko-image-preload then hidden it and show preloader
						// and show it again when preloading is end!!
						/// Wrap jostain syystä poistaa elementtien dragin koska niitä ei voi vetää enää sivuille
						$('.teeko-image-preload').each( function()
						{
							var $$ = $(this);
							var strStyle = '';
							
							if($$.css('float') !== 'none' && $$.css('float') !== '') strStyle='float:'+$$.css('float')+';';
							
							$$.wrap("<div class='teeko-image-wrapper' style='"+strStyle+"width:"+$$.css('width')+";height:"+$$.css('height')+";background:url(/images/ajax-loader.gif) center no-repeat'/>");
							$$.hide();
							
							$$.preloader(function() {
								//$$.fadeIn( function() { $(this).removeClass('teeko-image-wrapper').unwrap(); } );

								$$.fadeIn( function() { $(this).removeClass('teeko-image-preload').children().unwrap(); } );
							});
						});
						
						$(destination).find('.draggable').draggable();
											
						EmailProtection();
						
						if(editor.exists() === false) {
							hash.changeLinks(destination);
						}
						else
						{
							$(destination).find('a').not("[attr!=#]").not("[isHash=true]").children().unwrap();
						}
						
						data = null;						
					}
				}
				else
				{
					//Error('CRITICAL','success_function', "Destination: '"+destination+"' doesn't exists");
				}

				preloader.unload();

				// If custom callback is defined then eval it
				if(parms !== undefined)
				{
					if(typeof parms['callback'] == 'function')
					{
						parms['callback'].call('foo', data);
					}
					else if(parms['callback'])
					{	
						if(parms['callback'].substr(parms['callback'].length - 1) == ')')
							eval(parms['callback']);
						else
							eval(parms['callback']+'()');
					}
				}

				if(editor.exists() === true)
				{
					// Increase site_editor main div to page height and minus toolbar
					var newHeight = $(document).height() - $('#toolbar').height() - ($('#teeko-editor-element-tools').height() - 10);
					
					if(newHeight > 0) $('#site_editor').css('height', newHeight);
					
					$.teeko.editable( $(destination) );
				}

				XHR = undefined;
			}
			catch(ex)
			{
				//console.log(ex);
			//	 Error('CRITICAL','success_function', ex.message);
			}
   		}

		switch(smethod)
		{
			case 'get':
			case 'post':
				Cursor('Wait');
				// DEBUG: Tässä tulee virhe jostain syystä!! mutta pitää laittaa toimimaan				
				preloader.load();
				if($('.teeko-page-preloader').length > 0)
				{
					//$('.teeko-page-preloader').fadeIn(400);
					//$('.teeko-page-preloader').animate({opacity:'show'});
					$('.teeko-page-preloader').show();
				}
				break;
		}

		smethod = 'post';

		XHR = $.ajax({
			async: vasync,
    		type: smethod,
    		url: surl,
    		data: args_str,
    		//contentType: "text/html; charset=utf-8",
    		contentType: "application/x-www-form-urlencoded",
    		dataType: get_dataType,
    		success: success_function,
    		error: function (XMLHttpRequest, textStatus, errorThrown) 
    		{
//    			if(XMLHttpRequest.status != 200)
  //  			{
	    			//Error('CRITICAL','error', "ajax.js .ajax function Error - HTML status code: " + XMLHttpRequest.status);
	//    		}
    		}
		});
			
		Cursor('auto');
	/*}
	catch(ex)
	{
		Error('CRITICAL','success_function',ex.message);
	}*/

}


$.fn.request = function( act, element, parms )
{
	if(typeof act === 'undefined') return false;
			
	var args_str = "";

	if(element.length > 0)
	{
		var elements = element.split(',');

		var args = {};
		
		$.each(elements,function(i,item)
    	{
    		if($(item).length > 0)
    		{
				var svalue = $(item).attr('value');
				var sname = $(item).attr('name');
				//var sid = $(item).attr('id');
			
				args[sname] = svalue.replace(/(\")/g, '&#8221;').replace(/<(.|\n)*?>/g, '');
			}
    	});
    		
		args = JSON.stringify(args);
	}

	if(typeof smethod === 'undefined') var smethod = 'post';

	var get_dataType = 'json';

		if(typeof args !== 'undefined')
		{
			args_str = "args=" + encodeURIComponent(args);
		}
	
		var surl = 'template/'+act;

		var destination = $(this);
		
		var success_function = function(data, status) 
    	{    	
			Cursor('auto');	
       		try
    		{
    			if(data === '') return false;

				if(typeof data === 'object')
				{
					destination.empty();
				    $.each(data,function(i,item)
    				{
    					destination.append("<option value='"+i+"'>"+item+"</option>");
    				});
    				
					if(typeof parms['callback'] == 'function')
					{
						parms['callback'].call('foo', data);
					}
				}
				else
				{
				}

				XHR = undefined;
			}
			catch(ex)
			{
			}
   		}

		Cursor('Wait');

		XHR = $.ajax({
			async: true,
    		type: smethod,
    		url: surl,
    		data: args_str,
    		contentType: "application/x-www-form-urlencoded",
    		dataType: get_dataType,
    		success: success_function,
    		error: function (XMLHttpRequest, textStatus, errorThrown) 
    		{		
				Cursor('auto');
//    			if(XMLHttpRequest.status != 200)
  //  			{
	    			//Error('CRITICAL','error', "ajax.js .ajax function Error - HTML status code: " + XMLHttpRequest.status);
	//    		}
    		}
		});
}
