/*
 * 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*/
		targetMenu: false, /*the data loaded via ajax will be placed here*/
		saveLink: false,
		animateOut: false,
		animateIn: false,
		enableLoadStatus: 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: false, /* for use this to resolve bookmarking issues, see example for more details*/
		title: false, /* 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.AjaxifySaveLink = false;



	jQuery.fn.ajaxify = function(options) {
		if (jQuery(this).attr("ajaxify") != "done") {
			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('.');
			return this.each(function() {
				var current = jQuery.extend({}, jQuery.AjaxifyDefaults, options);
				current.item = jQuery(this);
				current.item.attr("ajaxify", "done");
				// alert(current.item.attr("nodeName"))
				if (jQuery.metadata) {
					current = jQuery.extend(current, jQuery(this).metadata());
				}


				if (current.event) {
					jQuery(this).bind(current.event, function(e) {
						jQuery(this).ajaxifyAnalyse(current);
						if (!current.hash)
							jQuery.ajaxifyLoad(current);
						else {
							jQuery.ajaxifyHash(current);
						}

						e.stopPropagation();

						//stop browser
						if (jQuery(this).is('a') || jQuery(this).is('form') || jQuery(this).is('tr') || jQuery(this).is('th')) 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;
					}
				}

			//return false;

			}); // end each fn 
		}
	}; // end ajaxify fn





	jQuery.fn.ajaxifyAnalyse = function(current) {
		current.object = this;
		if (jQuery(this).is('a') || jQuery(this).is('th') || jQuery(this).is('tr') || jQuery(this).is('td') || jQuery(this).is('img') || jQuery(this).is('span') || jQuery(this).is('div') || jQuery(this).is('li')) {
			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) {
		//alert(current.item.attr('nodeName'))
		if (current.enableLoadStatus == false || current.item.attr("ajax") != 'loaded') {
			if (current.saveLink == true) {
				jQuery.AjaxifySaveLink = current.link;
			}
			// turn off globals 
			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() {
					if (current.enableLoadStatus)
						current.item.attr("ajax", "loaded");
					current.onComplete(current)
				},
				beforeSend: function() {
					current.onStart(current);
					//if (!current.onStart(current)) return false;

//////////////////////////////////////////////////////// MODIFCATION
					if (jQuery.swftoFooter){
						jQuery.swftoFooter('.main-content');
					}
//////////////////////////////////////////////////////// MODIFCATION

					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) {

					HTMLoutput = "";
					jQuery(current.target).stop();
					jQuery('#AjaxifyLoading').remove();




					if (current.dataType == "html") {
						HTMLoutput = data;
					}
					else {
						if (data.failed == false) {
							if (data.response.type == 'navigation') {
								HTMLoutput = data.response.data;
								HTMLmenu = data.response.menu;
							}
							else {

								if (data.response.type == 'data') {
									HTMLoutput = data.response.data;
								}
								else {
									if (data.response.type == 'exception') {
										HTMLoutput = data.response.data;
										alert("do modal alert exception in the future");
									}
									else {
										alert("do modal  => can not do json data only json as html");
									}
								}
							}
						} else {
							data = $.json.deserialize(data);
							HTMLoutput = data.response.data;
							HTMLmenu = "";
						}
					}

					if (HTMLoutput != "") {
						if (current.title)
							document.title = current.title;
						else if (document.title != jQuery.AjaxifyPageTitle)
							document.title = jQuery.AjaxifyPageTitle;

						if (current.tagToload) {
							data = '<div>' + HTMLoutput + '</div>'; //wrap data so we can find tags within it.
							if (typeof current.tagToload == 'string') {
								jQuery.ajaxifyManip(current, jQuery(HTMLoutput).find(current.tagToload));
							} else if (typeof current.tagToload == 'object') {
								jQuery.each(current.tagToload, function(tag, target) {
									if (jQuery(HTMLoutput).find(tag).size())
										jQuery.ajaxifyManip(target, jQuery(HTMLoutput).find(tag));
									else
										jQuery.ajaxifylog('Warning: Tag "' + tag + '" couldn\'t be found.');

								});
							}

						} else {
							jQuery.ajaxifyUpdateContent(current, HTMLoutput);
							if (HTMLoutput != "")
								jQuery.ajaxifyManipMenu(current, HTMLmenu);
						}


						current.onSuccess(current, data);
						if (current.animateIn)
							jQuery(current.target).animate(current.animateIn, current.animateInSpeed);
					}

				},
				error: function(msg) {
					if (msg.status == 410 || msg.status == 401) {
						$.MyOverlay.hide();
						$.jGrowl.close()
						$.fn.mymodal({
							open: true, 
							width: "400", 
							inline: false, 
							title: "Account", 
							message: $('#message-session-expires').html(), 
							type: 'alert', 
							alertParameters: {
								okLabel: 'ok', 
								onOkCallback: function() {
									window.location.href = '/Account/LogOff'
								}
							}
						});

					} else {
						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.ajaxifyUpdateContent = function(current, data) {
		jQuery(current.target).html(data);
	};

	jQuery.ajaxifyManipMenu = function(current, data) {
		if (current.targetMenu != false)
			jQuery(current.targetMenu).html(data);
	};

	$.fn.ajaxify.getSavedLinkUrl = function() {
		alert(jQuery.AjaxifySaveLink);
	};
//////////////////////////////////////////////////////// MODIFCATION 

	jQuery.swftoFooter = function(contener){
		if ( SWFUpload.movieCount > 0) {
			$.each(SWFUpload.instances, function() {
				this.destroy();
			})

			$('.swfupload',contener).each(function() {
				$(this).appendTo('#footer').css('display', 'none');
			})
		}
	}
//////////////////////////////////////////////////////// MODIFCATION

})(jQuery);
