/*

 * Ajaxify - jQuery Plugin

 * version: 2.00 (11/12/2008)

 * Created by: MaX

 * Examples and documentation at: http://max.jsrhost.com/ajaxify/

 * licensed under and GPL licenses:

 * http://www.gnu.org/licenses/gpl.html

 */



(function($){





jQuery.AjaxifyDefaults = {  

		event:'click', /*specify the event*/

		link:false, /* specify the link, priority is for the href attr.*/

		target:'#container', /*the data loaded via ajax will be placed here*/

		animateOut:false,

		animateIn:false,

		animateOutSpeed:'normal',

		animateInSpeed:'normal',

		method: 'GET', /* the request method GET or POST*/

		tagToload:false, /* inserts just the tag from the data loaded, it can be specified as t a second argument in the 'target' attr(#box,#result)*/

		loading_txt:'',

		loading_img:"images/loading.gif",

		loading_target: false,

		loading_fn:function(options){

			jQuery.ajaxifyLoading(options);

		},

		loadHash:true,	/* for use this to resolve bookmarking issues, see example for more details*/

		title:true, /* change page title along with the request. */

		forms:false, /* send form data along with th request (forms, input , radio ... etc jquery selector) */

		params:'ajax=true',/*extend parameters for the webpage. it can be set to function since v2*/

		timeout:false, /*in ms.  there is a problem in this option on linux servers*/

		contentType:"application/x-www-form-urlencoded",

		dataType:'html',

		cache:false, /* force the browser not to cache*/

		username:false, /*username HTTP access authentication*/

		password:false, /*password HTTP access authentication*/

		onStart:function(op){}, /* a callback function before start requesting.*/

		onError:function(op){

			jQuery.ajaxifyManip(op,"<font style='color: #CC0000'>Error: </font> Couldn't open the page.");		

		}, /* a callback function if error happened while requesting*/

		onSuccess:function(op){},/* a callback function if the request finished successfuly*/

		onComplete:function(op){}//*a callback function when the request finished weather it was a successful one or not.*/

	};

jQuery.AjaxifyFirstLoad = true;

jQuery.AjaxifyhistorySet = new Object();

jQuery.AjaxifyPageTitle = document.title;

jQuery.AjaxifyDebug = false;







jQuery.fn.ajaxify = function(options) {  

	if(!jQuery(this).size()){

		jQuery.ajaxifylog('Error: No matched element/s for your ajaxify selector " '+jQuery(this).selector+' ".');

		return false;

	}

	var ver = jQuery.fn.jquery.split('.');

	if(ver[0] < 1 || ver[1] < 2 || ver[2] < 6){

		jQuery.ajaxifylog('Error: Your jQuery version is old. Version 1.2.6 or newer is required.');

		return false;

	}

	return this.each(function() {

	var current = jQuery.extend({},jQuery.AjaxifyDefaults, options);

	if(jQuery.metadata){

	current = jQuery.extend(current,jQuery(this).metadata());

	}

	

	

	if(current.event){

		jQuery(this).bind(current.event,function(){		

			jQuery(this).ajaxifyAnalyse(current);

			if(!current.hash)

				jQuery.ajaxifyLoad(current);

			else{

				jQuery.ajaxifyHash(current);

			}

			 //stop browser

			if(jQuery(this).is('a') || jQuery(this).is('form')) return false;

		});

	}else{

		jQuery(this).ajaxifyAnalyse(current);

		jQuery.ajaxifyLoad(current);		

	}	

		//for bookmarking	

		if(current.loadHash  && jQuery.AjaxifyFirstLoad){

			jQuery(this).ajaxifyAnalyse(current);

			if(document.location.hash.replace(/^#/, '') == current.hash	&& current.hash){

				jQuery.ajaxifyHash(current);

				jQuery.AjaxifyFirstLoad = false;

			}

		}

		

  }); // end each fn 

}; // end ajaxify fn





 



 

jQuery.fn.ajaxifyAnalyse = function(current){

	current.object = this;

	if(jQuery(this).is('a')){

		if(jQuery(this).attr('href')){

			//if(jQuery.browser.msie)

				//var link = jQuery(this).attr('href').replace(/^#/, "");

			//else

				var link = jQuery(this).attr('href').replace(/^#/, "");

				

				//alert(link);

			current.link = link || current.link;

		}else 

			current.link;

			

		if(typeof current.tagToload != 'object')

			if(jQuery(this).attr('target'))

				current.target = jQuery(this).attr('target');

			else

				current.target;

		else

			current.target = current.loading_target || '#AjaxifyTemp';

	}

	   

	if(!current.loading_target)

	   current.loading_target = current.target;

	   



	if(current.forms){

		var text = jQuery(current.forms).serialize();

		current.paramres = text;

	}

	

	if(typeof current.params == 'function')

		var params = current.params(current);

	else

		var params = current.params;



	if(typeof params == 'string'){

		if(text)

		current.paramres +='&'+params;

		else

		current.paramres = params;

	}

	

	var len = current.target.length-1;

	if(typeof current.tagToload !='object')

		if(current.target.charAt(len) == '+' || current.target.charAt(len)=='-'){

			current.manip = current.target.charAt(len);

			current.target = current.target.substr(0,len);

		}



   	if(current.loadHash){

		if(!jQuery.historyInit){

			jQuery.ajaxifylog('Error: loadHash is enabled but history plugin couldn\'t be found.');

		return false;

		}

		

		if(current.loadHash === true){

			jQuery.ajaxifylog('Info: It seemes you are upgrading from v1.0. Please see the new documentation about loadHash. "attr:href" will be used instead of "true".');

			current.loadHash = "attr:href";

		}

		if(current.loadHash.toLowerCase() == 'attr:href' || 

			current.loadHash.toLowerCase() == 'attr:rel' ||

			current.loadHash.toLowerCase() == 'attr:title'){

			

			current.loadHash = current.loadHash.toLowerCase();

			current.hash = jQuery(this).attr(current.loadHash.replace('attr:',''));

			if(jQuery.browser.opera){

				current.hash = current.hash.replace('?','%3F');

				current.hash = current.hash.replace('&','%26');

				current.hash = current.hash.replace('=','%3D');

			}

		}else

			current.hash = current.loadHash;

		

		if(!current.hash)

			jQuery.ajaxifylog('Warning: You have specified loadHash, but its empty or attribute couldn\'t be found.');

	}

	

	if(!jQuery(current.target).size() && typeof current.tagToload !='object')

		jQuery.ajaxifylog('Warning: Target " '+current.target+' " couldn\'t be found.');

 	



};



 





jQuery.ajaxifyLoading = function(options){

	var html = "<div id='AjaxifyLoading'><img src='"+options.loading_img+"' alt='Loading...' title='Loading...' >"+options.loading_txt+"</div>";

	if(options.loading_target)

		jQuery.ajaxifyManip(options.loading_target,html);

	else

		jQuery.ajaxifyManip(options,html);

}











jQuery.ajaxifyHash = function(current){

	var ob = new Object();

	jQuery.each(current, function(key, value) {

		ob[key] = value;

	});

	jQuery.AjaxifyhistorySet[ob.hash] = ob;

	location.hash = ob.hash;

	//if(jQuery.AjaxifyFirstLoad.history){

	//alert(ob.hash);

		jQuery.historyInit(jQuery.ajaxifyHistory);

		jQuery.AjaxifyFirstLoad.history = false;

	//}

};











jQuery.ajaxifyLoad = function(current) {

	// turn off globals 

	//alert('ajaxifyLoad'+print_r(current,true));

	jQuery.ajaxSetup({global:false});	

	//start calling  jQuery.ajax function. thank you jquery for making this easy

	jQuery.ajax({

		type: current.method,

		url: current.link,

		dataType: current.dataType,

		data: current.paramres,

		contentType:current.contentType,

		processData:true,

		timeout:current.timeout,

		cache:current.cache,

		username:current.username,

		password:current.password,

		complete: function(){

			current.onComplete(current)

		},

		beforeSend: function(){

			current.onStart(current);

			

			if(current.animateOut){

				if(current.loading_target != current.target);//diff target? fire before start anim

					current.loading_fn(current);

				jQuery(current.target).animate(current.animateOut,current.animateOutSpeed,function(){

					//alert('hr');

					if(!current.loading_target)//already fired

					current.loading_fn(current);		

				});

			}else

				current.loading_fn(current);

			},

		success: function(data){

			

		jQuery(current.target).stop();

		jQuery('#AjaxifyLoading').remove();
		
		
		
		
		
		data = '<div>'+data+'</div>'
		
		//alert('<div id="pagecontent">' + jQuery(data).find("div:eq(0)").html() + '</div>')
		loadPageContent('<div id="pagecontent">' + jQuery(data).find("div:eq(0)").html() + '</div>')
		
	
		document.title = jQuery(data).find("title").text()

	

		

		

		 

		current.onSuccess(current,data);

		if(current.animateIn)

			jQuery(current.target).animate(current.animateIn,current.animateInSpeed);

		  

		  },

		  error:function(msg){

			  jQuery(current.target).stop();

			  current.onError(current,msg);

			  if(current.animateIn)

		  jQuery(current.target).animate(current.animateIn,current.animateInSpeed);

		  }

		});

};











jQuery.ajaxifylog = function(message) {

	if(jQuery.AjaxifyDebug)

		if(window.console) {

			 console.debug(message);

		} else {

			 alert(message);

		}

};











jQuery.ajaxifyHistory = function(hash){

	if(hash){

		if(jQuery.browser.safari){

			var options = jQuery.AjaxifyhistorySet[location.hash.replace(/^#/,'')]; //fix bug in history.js

		}else

			var options = jQuery.AjaxifyhistorySet[hash];

		

		if(options)

			jQuery.ajaxifyLoad(options);

		else

			jQuery.ajaxifylog('History Fired. But I couldn\'t find hash. Most propabley, the hash is empty. If so, its normal.');

	}

};











jQuery.ajaxifyManip = function(current,data){



if(typeof current != 'object'){

	var target = current;

	var current = new Object;

	var len = target.length-1;

	if(target.charAt(len) == '+' || target.charAt(len)=='-'){

		current.manip = target.charAt(len);

		current.target = target.substr(0,len);

	}

	else{

		current.manip = '';

		current.target = target;

	}

	if(!jQuery(current.target).size())

		jQuery.ajaxifylog('Warning: Target "'+current.target+'" couldn\'t be found.');

}

	

		

	if(current.manip == '+')

		jQuery(current.target).append(data);

	else if(current.manip == '-')

		jQuery(current.target).prepend(data);

	else

		jQuery(current.target).html(data);

};





})(jQuery);