var Forms = new Array();
var mydialog = null;

$(document).ready(function ()
{
	
	$('form').each(function ( i )
	{
		Forms[i] = new Form();
		var $this = $(this);
		Forms[i].id = $this.attr('id');
		formData = "form=" + Forms[i].id + "&ajax_request=true&mode=schema";
		//$('#response').html(formData);
		$.ajax( {
			type : "GET",
			url : window.location.href,
			data : formData,
			dataType : "xml",
			encoding : "UTF-8",
			contentType : "application/x-www-form-urlencoded",
			error : function ( XMLHttpRequest , textStatus , errorThrown )
			{
				alert(formData + ' ' + textStatus);
			},
			success : function ( schema )
			{
				Forms[i].schema = schema;
				assignEventHandlers(i);
			}
		});
	});
	
	$('input:submit').click(function(){
		
		$(this)
			.after('<span class="working"></span>')
			.hide();
	});
	
	$(".imglink").live("click",
		function()
		{
			showDialog( $(this).attr ( "href" ) );
			return false;
		}
	);

	$(".googlemap").css({"display":"block"});

	$("a.delete").click(
		function ()
		{
			return confirm ('Click OK to confirm delete.');
		}
	);
	
	$('ul#journeylinks li:first a').addClass('here');
	
	$('a.journeylink').click(
		function (event)
		{
			$('ul#journeylinks li a.here').removeClass('here');
			$(this).addClass('here');
			$('.journey_details').hide();
			var $j = $(event.target.hash);
			$j.fadeIn('500');
			var targetOffset = ($j.offset().top) - 150;
			//$('html,body').animate({scrollTop: targetOffset}, 1000);
			
			var $jid = event.target.hash.replace('#j','');
			highLightJourney($jid);
			return false;
		}
	);
	
});

function showDialog(cont)
{
	
	if (mydialog == null)
	{
		$('body').append('<div id="dialog"><img src="'+cont+'" /></div>');
		mydialog = $("#dialog");
	}
	else
	{
		mydialog.find('img').attr("src",cont);
	}
	mydialog
		.dialog(
			{
				modal: true ,
				width: "auto" ,
				maxWidth: 500 ,
				close:	function(ev, ui)
						{
	                		$(this).dialog("destroy");
						}
			}
		);

}

function inputUpdate ( formData , handler )
{
	//$('#response').html(formData);
	$.ajax( {
		type : "GET",
		url : window.location.href,
		data : formData,
		dataType : "json",
		contentType : "application/x-www-form-urlencoded",
		error : function ( XMLHttpRequest , textStatus , errorThrown )
		{
			//alert(formData + ' ' + textStatus);
		},
		success : function ( response )
		{
			eval(handler)(response);
		}
	});
}

function assignEventHandlers ( frm )
{
	schema = Forms[frm].schema;
	var form = $('application attributes id', schema).text();
	$("*[ajax]", schema).each(
			function()
			{
				var schemainput = $(this).parents('input');
				var inputname = (schemainput.get(0).nodeName);
				var htmlinput = $("[name='" + schemainput.attr('name') + "']" , document);
				
				var event = $(this).attr('ajax');
				
				switch (schemainput.attr('type'))
				{
					case 'select':
						switch (event)
						{
							case 'change':
								htmlinput.change(
										function ()
										{
											processSelect($(this), frm);
										}
										);
								/*htmlinput.live ( 'change' , function ()
								{
									alert('changing');
									processSelect($(this), frm);
								});*/
								break;
						}						
						break;
					case 'text':
					case 'password':
					case 'textarea':
						switch (event)
						{
							case 'keyup':
								htmlinput.keyup(
										function ()
										{
											suggestText($(this), frm);
										}
										);
								/*htmlinput.live ( 'change' , function ()
								{
									alert('changing');
									processSelect($(this), frm);
								});*/
								break;
							case 'blur':
								/*
								 * blur not supported in live 'yet'. htmlinput.blur ( //
								 * function () { alert ('Ajaxing ' + htmlinput.attr ( 'name' ) +
								 * '.'); //processText ( htmlinput.attr ( 'name' ) , frm ) } );
								 */
								htmlinput.blur(function ()
								{
									if ($(this).val() != '')
									{
										processText($(this), frm);
									}
								});
								break;
						}	
						
						break;
					case 'radio':
					case 'checkbox':
						htmlinput.live("click", function ()
						{
							//alert('Ajaxing ' + htmlinput.attr('name') + '.');
							// processChecks ( $( this ) , frm );
							});
						break;
				}
				
			}
	);
}

function processSelect ( input , frm )
{
	var thisData = "&infield=" + input.attr('name') + "&mode=select&method=processSelect";
	var formData = $("form[id='" + Forms[frm].id + "']", document).serialize()
			+ "&ajax_request=true&form=" + Forms[frm].id + thisData;
	var dependant = $("input[name='" + input.attr('name') + "'] dependancy field" , Forms[frm].schema).text();
	$("*[name='" + dependant + "']" , document ).after('<span id="' + dependant + 'working" class="working"></span>');
	inputUpdate(formData + thisData, 'updateSelect');
}

function processText ( input , frm )
{
	var thisData = "&infield=" + input.attr('name') + "&mode=text&method=processText&frm=" + frm;
	var formData = $("form[id='" + Forms[frm].id + "']", document).serialize()
			+ "&ajax_request=true&form=" + Forms[frm].id + thisData;
	inputUpdate(formData + thisData, 'updateText');
}

function suggestText( input , frm )
{
	var thisData = "&infield=" + input.attr('name') + "&mode=text&method=suggestText&frm=" + frm;
	var formData = $("form[id='" + Forms[frm].id + "']", document).serialize()
			+ "&ajax_request=true&form=" + Forms[frm].id + thisData;
	inputUpdate(formData + thisData, 'showSuggest');
}

function processChecks ( input , frm )
{
	var thisData = "&infield=" + input.attr('name') + "&mode=check&method=processChecks";
	var formData = $("form[id='" + Forms[frm].id + "']", document).serialize()
			+ "&ajax_request=true&form=" + Forms[frm].id + thisData;
	var dependant = $("input[name='" + input.attr('name') + "'] dependancy field" , Forms[frm].schema).text();
	$("*[name='" + dependant + "']" , document ).after('<span id="' + dependant + 'working" class="working"></span>');
	inputUpdate(formData + thisData, 'updateSelect');
}

function updateSelect ( response )
{
	for ( var i = 0; i < response.field.length; i++)
	{
		var input = $('#' + response.field[i], document);
		$('#' + response.field[i] + ' option:not(:first-child)').each(
				function ()
				{
					$(this).remove();
				});
		for ( var j = 0; j < response.data[i].value.length; j++)
		{
			var opt = document.createElement('option');
			opt.setAttribute('value', response.data[i].value[j])
			var txt = document.createTextNode(response.data[i].display[j]);

			$(opt).append(txt);
			input.append(opt);
		}
		if ($.browser.msie)
		{
			$('#' + response.field[i]).css({'zoom':'1'});
		}
		$("#" + input.attr('name') + "working" , document).remove();
	}
}


function showSuggest( response )
{
	var input = $( "input[name='" + response.field + "']" , document );
	var docParent = input.parents( 'div.input' );
	var pos = input.position();
	input.blur( function(){ $("#"+response.field+"-suggest").fadeOut(750, function() { $(this).remove(); } ); } );
	var anim8 = true;
	if ($("#"+response.field+"-suggest").length > 0)
	{
		$("#"+response.field+"-suggest").remove();
		anim8 = false;
	}
	if (response.datamember.length == 1)
	{
		$("#"+response.field).val(response.datamember[0].username);
	}
	if (response.datamember.length > 1)
	{
		
		var ul = '<ul class="suggested-text" id="'+response.field+'-suggest">';
		$.each(response.datamember,
				function(i,obj)
				{
					ul += '<li>'+obj.username+'</li>';
				}
				);
		ul +='</ul>';
		var ptop = pos.top + input.outerHeight(true);
		if (anim8)
		{
			docParent.append(ul).animate({"opacity":1,"display":"block"},750);
		}
		else
		{
			docParent.append(ul);
			$("#"+response.field+"-suggest").css({"opacity":1,"display":"block"});
		}
		var suggestList = $("#"+response.field+"-suggest");
		suggestList.css({"background":"#fff","position":"absolute","top":ptop+"px","left":pos.left,"width":input.outerWidth(true),"z-index":"999","max-height":"80px"});
		$("#"+response.field+"-suggest li")
			.hover(
				function()
				{
					$(this).css({"cursor":"pointer","background":"#BFBE0C","color":"#fff"});
				}
				,
				function()
				{
					$(this).css({"cursor":"auto","background":"transparent","color":"#000"});
				}
				)
			.each(
				function(i)
				{
					$(this).click(
							function()
							{
								$("#"+response.field).val($(this).text());
								$("#"+response.field+"-suggest").fadeOut(750, function() { $(this).remove(); } );
							}
							);
				}
				);
	}
}

function updateText ( response )
{
	//alert(response.regex.length);
	var input = response.field;
	var docParent = $( "input[name='" + input + "']" , document ).parents( 'div.input' );
	$('div.error' , docParent)
		.slideUp( 'fast' )
		.remove();
	var err = false;
	
	if (response.regex)
	{
		if (response.regex.length > 0)
		{
			if (response.regex == 'false')
			{
				err = true;
				createErrorNote (response , 'regex');
			}
		}
	}
	if (response.datamember)
	{
		if (response.datamember.length > 0)
		{
			if (response.datamember == 'false')
			{
				err = true;
				createErrorNote (response , 'datamember');
			}
		}
	}
	if	(
		!err
		&&
		$('#' + input + 'valid').length == 0
		)
	{
		$("input[name='" + input + "']").after('<span id="' + input + 'valid" class="valid-input"></span>');		
	}
}

function createErrorNote ( response , method )
{
	var input = response.field;
	$('#'+input+'valid').remove();
	var template	=	response.template;
	var errTmp	=	$( "input[name='" + input + "']" , template ).parents( 'div.input' ).children( 'div.error' );
	var docParent = $( "input[name='" + input + "']" , document ).parents( 'div.input' );
	var message = $("input[name='" + input + "'] message validation " + method , Forms[response.frm].schema ).text();
	if	($('div.error' , docParent).length == 0)
	{
		$('li' , errTmp).text(message);
		docParent.append(errTmp);
		errTmp.slideDown( 'slow' );
	}
	else
	{
		var li = $( "div.error ul" , docParent).children('li:first').clone();
		li.text(message);
		$( "div.error ul" , docParent).children('li').remove();
		$( "div.error ul" , docParent).append(li);
		li.slideDown( 'slow' );
	}
}

function createSuccess( input )
{
	
}

function Form ()
{
	this.fields = new Array();
	this.schema;

	function addField ( $field )
	{

	}

	function submit ()
	{
		return this.validateFields();
	}

	function validateFields ()
	{
		for ( var i = 0; i < this.fields.length; i++)
		{
		}
	}
}