if(typeof API == 'undefineaginationd') API = {};
API.ajaxform = new function(){	
	
	var stack = Array();
	this.create = function(params) {
		var index = stack.push(new ajaxform(params));
		return stack[index - 1];
	}
	this.getStack = function() {
		return stack;
	}

	var ajaxform = function(params) {
		
		var instance = this;
		this.params = {
			form: 'form.ajaxify, form.validate',
			container: '.ajaxContent',
			select: 'body',
			replace: true,
			pagination: true,
			onReady: function(){
				var tl = $('a.toplayer');
				tl.unbind('click');
				tl.click(function(){
		
					var url = $(this).attr('href');
					var title = $(this).attr('title');
					if(url != null){			
						API.toplayer.add({
							url: url,
							layer: {
								label: title
							}
						});			
					}
					return false;				
				});
			}
		};
		
		jQuery.extend(true, this.params, params);
		
		var ajaxChannel = function(args){
			
			$.ajax({
				url: args.url,
				data: args.data,
				dataType: 'html',
				type: args.method || 'get',
				success: function(data){
					if (data) {
						if (typeof args.success == 'function'){
							args.success(data);
						}								
					}
				}
			});			
		}
		var t = null; 
		var hIt = null;
		var cnt = null;
		var prevHash = null;
		this.init = function() {
			prevHash = window.location.hash;
			cnt = $(instance.params.container);
			if(cnt.size() <= 0) return false;
			
			if(instance.params.form != null){
				instance.ajaxform();
			}
			if(instance.params.pagination){
				instance.pagination(false);
				$(document).ajaxSuccess(function(){
					instance.pagination(true);
				});	
			}			
		}

		this.hashchange = function(action) {
			if( typeof action == 'function') {
				action(window.location.hash,false);
			}
			if(("onhashchange" in window) && !($.browser.msie)) {
				window.onhashchange = null;
				window.onhashchange = function() {
					if( typeof action == 'function') {
						action(window.location.hash,true);
					}
				}
			} else {
				try{
					clearInterval(hIt);
				}catch(e){}
				hIt = window.setInterval(function() {
					if(window.location.hash != prevHash) {
						prevHash = window.location.hash;
						if( typeof action == 'function') {
							action(window.location.hash,true);
						}
					}
				}, 400);
			}			
		}
		this.pagination = function(preanimate){
			
			var pagination = $('.pagination',cnt);
			var page = $('.next,.prev',pagination);
			page.unbind('click');
			page.click(function(){
				var href = $('a',this).attr('href');
				instance.params.page = href.match(/P\d+$/);
				window.location.hash = instance.params.page; 				
				return false;
			});
			if(!preanimate){
				instance.hashchange(function(location,isEvent){
					var page = location.match(/P\d+$/);
					if(page != null && instance.params.page != page){
						instance.params.page = page;
						instance.setPage();
					}else if(isEvent && window.location.hash == ""){
						window.location.hash = "P0";
					}
				});	
			}
		}
		this.setPage = function(page){
			var forms = $(instance.params.form);
			if(forms.size() > 0){
				forms.submit();
			}else{
				url = window.location.pathname.split("/");
				url.push(instance.params.page[0]);
				url = url.join("/");
				instance.loadData(null,null,null,'get',url);
			}
		}
		this.loadData = function(target,trigger,data,method,url){
			
			//url = url.match(/^((http|https):\/\/(.*?\/))?(.*)$/);//remove domain
		
			target = $(cnt);
			trigger = $(trigger);
			if(trigger.size() > 0 && !instance.lock(trigger)) return false;
			instance.lock(target);
			ajaxChannel({
				url: url,
				data: data,
				method: method || 'get',
				success: function(data){
					
					if(instance.params.replace){
						$(instance.params.container).html('');	
					}
					
					ajaxContent = $('.ajaxContent',data);
					if(ajaxContent.size() > 0){
						data = ajaxContent.html();
					}
					data = $(data);
					var size = $('.box',data).size();						
					var row = Math.round((size+1)/3);
					
					data.hide();
					
					if(!cnt.hasClass('noresize'))				
						cnt.animate({height: (row*254)+46},400,function(){
							var offset = cnt.offset().top;
							$('html,body').animate({scrollTop: offset}, 400);	
						});						
					$(instance.params.container).append(data);
					if(typeof instance.params.onReady == 'function'){
						instance.params.onReady();
					}
					data.fadeIn(800);
					instance.unlock(target);
					instance.unlock(trigger);
				}
			});
		}
		
		this.ajaxform = function(){
			var forms = $(instance.params.form);			
			var checkboxes = $('input[type="checkbox"]',forms);		
			checkboxes.unbind('change');	
			checkboxes.change(function(){
				var elm = $(this);
				try{
					clearTimeout(t);
				}catch(e){}
				t = setTimeout(function(){
					elm.parents('form').submit();
				},1000);
			});
			forms.submit(function(){
				var form = $(this);
				if(form.hasClass('validate') && typeof API.validate != 'undefined'){
					if(!API.validate.isValid(this)) {
						var inputs = $(this).find('input,textarea');
						inputs.unbind('blur');
						inputs.blur(function(){
							API.validate.isSingleValid(this);
						});
						if(typeof API.defaultContent != 'undefined'){
							API.defaultContent.set();				
						}
						return false;
					}
				}
				var end = form.attr('action').lastIndexOf("/");
				var action = form.attr('action').slice(0,end+1);
				var page = (typeof instance.params.page != "undefined" && instance.params.page != null)? "/"+instance.params.page : "";								
				var url = action + form.attr('rel') + page;				
				data = $(this).serialize();
				instance.loadData(null,form,data,'post',url);
				instance.params.page = null;
				return false;
			});
		}
		this.lock = function(elm){
			
			elm = $(elm);
			if(!elm.hasClass('locked')){
				locker = $('.lock',elm);
				if(locker.size() == 0){
					locker = $('<div class="lock">&nbsp;</div>');				
				}
				locker.css({
					width: elm.width(),
					height: elm.height()
				});			
				elm.append(locker);		
				elm.addClass('locked');
				return true;
			}else{
				return false;
			}
		}
		this.unlock = function(elm){
			
			elm = $(elm);
			locker = $('.lock',elm);
			locker.remove();
			elm.removeClass('locked');
		}
		
		$(document).ready(function(){			
			instance.init();
		});
	}
}
