//needed when moving items in different folders
//////////////////////////////////////////////////////////////////////
// myajax				                                            //
//                                                                  //
// DOM - select object                                              //
// 								                                    //
// Copyright (C) 2006 - 2007  design project, www.dsnproject.hr     //
//								                                    //
// License: Commercial						                        //
//////////////////////////////////////////////////////////////////////
function call_user_func_array(func, parameters) {
    if (typeof func == 'string') {
        if (typeof this[func] == 'function') { func = this[func]; } else {
            func = (new Function(null, 'return ' + func))();
        }
        if (typeof func != 'function') {
            throw new Exception(func + ' is not a valid function');
        }
    }
    
	if (parameters)
		return func.apply(null, parameters);
	else
		return func.apply(null);

}
function myajax_query_link(url,key,value,filename,add_empty){
	var output="";
	var added=false;

	if (url)
		hashed = url.split('#');
	else 
		hashed=Array();
		
	if (hashed[0])
		hu = hashed[0].split('?');
	else 
		hu=Array();
	
	if (hu[0])
		filename=hu[0];
	else if (!filename)
		filename='';

	if (hu[1]){
		gy = hu[1].split("&");		
		
		for (i=0;i<gy.length;i++) {
			ft = gy[i].split("=");
			output=output+"&"+ft[0]+"=";
		
			if (ft[0]!=key){
				output=output+ft[1];
			} else {
				output=output+value;
				added=true;
			}
		}			
	} 
	
	if ((!added && value) || (!added && add_empty)){
		output=output+"&"+key+"="+value;
	}
	
	if (output)
		output=output.substring(1);	
	
	new_url=filename+"?"+output;
	
	if (hashed[1])
		new_url=new_url+hashed[1];
	
	return new_url;
}



function myajax_success(msg,settings){
	/*	
	settings.div=>'div to load'
	settings.effect=>'effect to use',
	settings.success=>'function to call'
	settings.errors=>'function to call'	
	settings.done=>'function to call',
	settings.lightbox=true,//to show lightbox on general response 
	settings.lightbox_success=true,//to show lightbox only if it's success
	settings.lightbox_errors=true,//to show lightbox only if there was an error
	settings.lightbox_timer=4000,//delay to show lightbox
	settings.loader=>true,
	settings.loader_div=>'div to load',
	settings.loader_html=>'loading...',
	settings.loader_success=>'loading done!',	
	settings.loader_eval=>'script to execute on load',
	settings.loader_display=>'none',	 // to hide it when loading is done
	settings.force_submit=>true,if we want to submit form no matter it has errors
	settings.submission_url=>'where to submit',
	settings.return_call=>return type, similar to success	
	*/
	//default settings here	
	if (settings.loader || settings.loader_div){
		if (!settings.loader_success)
			settings.loader_success='';
		
		if (!settings.loader_div){
			$("#"+settings.div).html(settings.loader_success);	
		} else {
			$("#"+settings.loader_div).html(settings.loader_success);	
		}
		
		if (settings.loader_display=='none'){
			$('#'+settings.loader_div).css({display:'none'});
		}
	} else if (settings.effect=='mylightbox'){
		$("#mylightbox_preloader").remove();				
	}

	if (!settings.response)
		settings.response={};
		
	if (!settings.response.errors)
		settings.response.errors={};
		
	if (!settings.response.valid)
		settings.response.valid={};
		
	if (!settings.response.errors_fields)
		settings.response.errors_fields={};		
		
	if (!settings.act)
		settings.act='';
		
	if (!settings.lightbox_timer)
		settings.lightbox_timer=4000;
		
	//handle success
	if (settings.success){
		settings.success_return_call=function(){
			eval(settings.success);			
		}
	}
	if (settings.success_return_call && !settings.response.errors[settings.act]){
		call_user_func_array(settings.success_return_call, [msg]);					
	}
	
	
	//handle errors
	if (settings.errors){
		settings.errors_return_call=function(){
			eval(settings.errors);			
		}
	}
	if (settings.errors_return_call && settings.response.errors[settings.act]){
		call_user_func_array(settings.errors_return_call, [msg]);					
	}	
	
	

	if ((settings.lightbox || settings.lightbox_success) && settings.response.valid[settings.act]){	
		LightBox({delay:settings.lightbox_timer,msg:settings.response.valid[settings.act].join(';'),mode:'valid'});			
	}

	if ((settings.lightbox || settings.lightbox_errors) && settings.response.errors[settings.act]){
		LightBox({delay:settings.lightbox_timer,msg:settings.response.errors[settings.act].join(';'),mode:'errors'});					
	}
	

		
			
	switch (settings.effect){
	case 'toggle':
		if (settings.div){
			$("#"+settings.div).html(msg);	
			$("#"+settings.div).css({display:'none'});
			$("#"+settings.div).slideDown("slow");
		}
		break;
	case 'fade':
		if (settings.div){	
			$("#"+settings.div).html(msg);			
			$("#"+settings.div).css({opacity:0});			
			$("#"+settings.div).fadeTo("slow",1);				
		}
		break;
	case 'mylightbox':
		settings.html=msg;
		createMylightbox(settings);		
		break;
	case 'debug':
		alert(msg);
		break;
	default:
		if (settings.div){
			$("#"+settings.div).html(msg);					
		}
		break;
	}

	if (settings.return_call)
		call_user_func_array(settings.return_call, [msg]);
		
	if (settings.done){
		eval(settings.done);
	}	

}
function myajax_preloader(settings){
	//settings.loader=>true,
	//settings.loader_div=>'div to load',
	//settings.loader_html=>'',	
	
	if (settings.loader || settings.loader_div){
				
		if (!settings.loader_html)
			settings.loader_html='<img src="templates/js/myajax/ajax-loader.gif" id="myajax_loader" />';
			
		if (!settings.loader_div){
			$("#"+settings.div).html(settings.loader_html);	
		} else {
			var loader_div=document.getElementById(settings.loader_div);
			
			if (!loader_div)
				$("html").append('<div id="'+settings.loader_div+'"></div>');	
				
			if (document.getElementById(settings.loader_div).style.display=='none')
				$('#'+settings.loader_div).css({display:'block'});
			
			$("#"+settings.loader_div).html(settings.loader_html);	
		}		
	} else if (settings.effect=='mylightbox'){
		$("html").append('<div id="mylightbox_preloader"></div>');	
	}
	
	if (settings.loader_eval){
		eval(settings.loader_eval);
	}
}

function myajax_Request(settings){	
	//settings.url=>'what to load',
	//settings.type=>'method to use',	
	//default_settings here	
	//request_params

	if (!(settings.div && !$("#"+settings.div).length) || !settings.div){

		if (!settings.type)
			settings.type='GET';
			
		if (settings.data)
			settings.data='';
					
		if (settings.loader_div){		
			if ($('#'+settings.loader_div).css('display')=='none'){
				$('#'+settings.loader_div).css({display:'block'});
			}
		}
			
		myajax_preloader(settings);		
		
		if (settings.request_params){
			request_params=settings.request_params.split('&');
			if (request_params){
				for ($i=0;$i<=request_params.length-1;$i++){
					key_values=request_params[$i].split('=');
					
					settings.url=myajax_query_link(settings.url,key_values[0],key_values[1]);
				}
			}
		}
		
		$.ajax({
			cache: false,
			url:settings.url,
			data:settings.data,		
			type:settings.type,
			success:function(msg){
				myajax_success(msg,settings);
			}
		});	
	} else
		document.location.href=settings.url;
}

function myajax_FormRequest(submited_form,settings){	
	//settings.url=>'what to load',
	//default_settings here		
	
	//request_params	

	if (!settings.submission_url)
		settings.submission_url=document.location.href;		

	if (settings.request_params){
		request_params=settings.request_params.split('&');
		if (request_params){
			for ($i=0;$i<=request_params.length-1;$i++){
				key_values=request_params[$i].split('=');
				
				settings.submission_url=myajax_query_link(settings.submission_url,key_values[0],key_values[1]);
			}
		}
	}

	if (settings.loader_div){		
		if ($('#'+settings.loader_div).css('display')=='none'){
			$('#'+settings.loader_div).css({display:'block'});
		}
	}
	
	myajax_preloader(settings);	

	var options = {
		timeout:3600000,
		url:settings.submission_url,
		success:function(msg){
			myajax_success(msg,settings);
		}
	}
				
	
	$(submited_form).ajaxSubmit(options); 
}

function myajax_Form(submited_form,settings){
	//request_params		
	
	var targetContent = $("input[name='act']", submited_form);	
	
	if (!settings.submission_url)
		settings.submission_url=document.location.href;	
		
		
	if (settings.request_params){
		request_params=settings.request_params.split('&');
		if (request_params){
			for ($i=0;$i<=request_params.length-1;$i++){
				key_values=request_params[$i].split('=');
				
				settings.submission_url=myajax_query_link(settings.submission_url,key_values[0],key_values[1]);
			}
		}
	}

	if (settings.loader_div){		
		if ($('#'+settings.loader_div).css('display')=='none'){
			$('#'+settings.loader_div).css({display:'block'});
		}
	}
	
	myajax_preloader(settings);
	
	var options = {
		
		////add &validator=true to submission url so we can get response
		timeout:3600000,
		url:myajax_query_link(settings.submission_url,'validator','true','index.php'),
		success:function(msg){
			eval("var response="+msg);
			
			
						
			settings.act=$(targetContent).attr("value");

			settings.response=response;
			
			
			$("input, select, textarea",submited_form).removeClass('req');
			if ((response.errors && !response.errors[settings.act]) || !response.errors || settings.force_submit){

				if (!(settings.div && !$("#"+settings.div).length) || !settings.div){
					var options = {
						url:settings.submission_url,
						success:function(msg){
							
							myajax_success(msg,settings);
						}
					}
					$(submited_form).ajaxSubmit(options); 	
				} else {
					$(submited_form).die("submit");
					submited_form.submit();
										
					return true;					
				}
			}else{
				//update fields
				if (response.errors_fields && response.errors_fields[settings.act]){
					var select_string="";
					for(i=0;i<=response.errors_fields[settings.act].length;i++){
						if (select_string)
							select_string=select_string+', ';
							
						select_string=select_string+'#'+response.errors_fields[settings.act][i];
					}
					$(select_string,submited_form).addClass('req');
				}
				
				//so that blank form doesnt show up
				settings.div='';
				
				myajax_success('',settings);			
			}
		}
	}
				
	
	$(submited_form).ajaxSubmit(options); 	
	
}

function myajax() {
	
	$("a").live('click',function(){
								 
					
		var rel_att=$(this).attr("rel");
		if (rel_att){
						
			if (rel_att.toLowerCase().substring(0,6)=='myajax'){				

				eval("var settings="+rel_att.substring(6,rel_att.length));
				
				if (!settings.url)
					settings.url=$(this).attr("href");	
				
				myajax_Request(settings);
				return false;
			}
		}
	});


	$("form").live("submit",function(){
		var rel_att=$(this).attr("rel");
		if (rel_att){
			if (rel_att.toLowerCase().substring(0,6)=='myajax'){	

				eval("var settings="+rel_att.substring(6,rel_att.length));			

				myajax_Form(this,settings)
				return false;	
			}
		}
	});		
}
$(document).ready(myajax);
