(function($) {
	
	var _self = this;
	
	this.options = {
		autocomplete: {
			multiple: false,
			matchContains: true
		},
		placeholders:{
			left: 	"i.rph",
			right:	"i.cph"
		},
		statusClasses: {
			right: {
				ok: 	'cph_ok',
				error: 	'cph_error',
				wait: 	'cph_wait'
			},
			left: {
				ok:		'rph_ok',
				error:	'rph_error'
			},
			field: {
				valid: 		'valid',
				invalid: 	'invalid',
				missing:	'missing',
				required:	'required'
			}
		},
		bindClassPreffix: 'bind-',
		handlers: {
			onFieldValid: function ( response, $field ){
				if ($field.val() == 'http://') {
					setStatus($field, false);
				} else {
					setStatus($field,'ok');
				}
			},
			onFieldInvalid: function ( response, $field, msg ){
				
				if (!$field.hasClass(_self.options.statusClasses.field.required) && $field.val() == '') {
					setStatus($field, false);
				} else {
					setStatus($field, 'error', msg);
				}
			}
		},
		directoryUri: '/ajax/activitydir'
	};
		
	function pregQuote(str){
		var quote_chars = ["\\", ".", "+", "*", "?", "[", "^", "]", "$", "(", ")", "{", "}", "=", "!", "<", ">", "|", ":"];
    	var return_val = new String(str);
    	
    	for(var i=0;i<quote_chars.length;i++){
        	//eval("var pattern = /\\"+quote_chars[i]+"/gi");
        	var pattern = new RegExp("\\"+quote_chars[i],'gi');
        	return_val = return_val.replace(pattern, String.fromCharCode(92)+quote_chars[i]);
    	}
    return return_val;
	}
	
	function setStatus( $field, status, message ){
		
		//var $left 	= $field.prevAll(_self.options.placeholders.left+':first');
		//var $right 	= $field.nextAll(_self.options.placeholders.right+':first');
		
		var $left 	= $field.parents(".row,.rowSel").eq(0).find(_self.options.placeholders.left+':first');
		var $right 	= $field.parents(".row,.rowSel").eq(0).find(_self.options.placeholders.right+':first');
		
		$left
			.removeClass(_self.options.statusClasses.left.error)
			.removeClass(_self.options.statusClasses.left.ok);
			
		$right
			.removeClass(_self.options.statusClasses.right.error)
			.removeClass(_self.options.statusClasses.right.ok)
			.removeClass(_self.options.statusClasses.right.wait);
		
		$field.removeAttr('readonly')
			.removeClass(_self.options.statusClasses.field.valid)
			.removeClass(_self.options.statusClasses.field.invalid)
			.removeClass(_self.options.statusClasses.field.missing);
		
		switch( status ){
			case 'ok':
				if ( $field.hasClass(_self.options.statusClasses.field.required) || $field.val() != '') {
					if( $field.is(':not(.validate)') ){
						$left.addClass(_self.options.statusClasses.left.ok);
					}
					
					if( $field.is(":not(.sv)") ){
						$right.addClass(_self.options.statusClasses.right.ok).find('nobr').text('');
						$field.addClass(_self.options.statusClasses.field.valid);
					}
				}
				break;
			case 'missing':
				$field.addClass(_self.options.statusClasses.field.missing);
			case 'error':
					if( $field.hasClass( _self.options.statusClasses.field.required ) || $field.val() != '' ){
						if ($field.is(':not(.validate)')) {
							$left.addClass(_self.options.statusClasses.left.error);
						}
						$right.addClass(_self.options.statusClasses.right.error);
						$field.addClass(_self.options.statusClasses.field.invalid);
					}
					
					if( message ){
						var $messagePH;
						if( ( $messagePH = $right.find('nobr') ).size() == 0 ){
							$right.append( $messagePH = $("<nobr/>" ) );
						}
						$messagePH.text( message );
					}	
					
				break;
			case 'wait':
				if ($field.is(':not(.validate)')) {
					$left.addClass(_self.options.statusClasses.left.ok);
				}
				$right.addClass(_self.options.statusClasses.right.wait).find('nobr').replaceWith('');
				$field.attr('readonly','readonly');
				break;
		}	
	}
	
	function showTooltip(){
		$this = $(this);
		
		if( $this.is('button') ){
			return;
		}
		
		if( $this.attr('alt') != '' || ( $this.parents(".rowSel, .row").find('.tooltip').size() > 0 && $this.parents(".rowSel, .row").find('.tooltip').text() != '' ) ){
			if (!$this.hasClass('din')) {
				
				$this.parents(".rowSel, .row").find('.tooltip').css({
					display: 'inline'
				});
				
			} else {
			//	$this.prev('div.inputInfo').hide();
			}
		}
	}
	
	function hideTooltip(){
		$this = $(this);
		
		if( $this.is('button') ){
			return;
		}
		
		if (!$this.hasClass('din')) {
			$this.parents(".rowSel, .row").find('.tooltip').hide();
		} else if( $this.val() == '' ) {
		//	$this.prev('div.inputInfo').show();
		}
	}
	
	$.fn.mskFormShowTooltip = function(){
		return this.each(function(){
			showTooltip.call(this);
		});
	}
	
	$.fn.mskFormHideTooltip = function(){
		return this.each(function(){
			hideTooltip.call(this);
		});
	}
	
	function validateAll( $fields, onSeccess, autobinding ){
		if( autobinding == undefined ){
			autobinding = true;
		}
		
		$form = $fields.eq(0).parents("form:first");
		var validateUrl = $form.attr('rel');
		validateUrl = location.protocol + '//' + location.host + validateUrl;
		
		var data = {};
		var fields = {};
		var fieldsIndexes = {};
		var fieldsCount = 0;
		
		$fieldsFiltered = $fields
			.not('.'+_self.options.statusClasses.field.valid)
			.not(".nv")
			.filter(':input.'+_self.options.statusClasses.field.required+",:input.validate[value!=''], input.fckb-value, :input.sv" );
		
		var $fieldsFilteredTmp = $fieldsFiltered;
		if (autobinding) {
			$fieldsFilteredTmp.each(function(){
				var $nfs = getRelatedFields($(this));
				$fieldsFiltered.add( getRelatedFields($(this)) );
			});
		}
		
		$fieldsFiltered.each(function(){
			var $f = $(this);
			
			var fname = escape($f.attr('name')); 
			
			if( (/\[\]/).test( $f.attr('name') ) ){
				
				var rname = $f.attr('name').replace(/\[\]/,'');
				
				if( fieldsIndexes[ rname ] == undefined ){
					fieldsIndexes[ rname ] = 0;
				} else {
					fieldsIndexes[ rname ]++;
				}
				
				fname = escape($f.attr('name')+"["+fieldsIndexes[ rname ]+"]");
			}
			
			if( $f.is("[type='checkbox']") && !$f.is(":checked") ){
				
				if (!$f.is(".ss")) {
					return;
				}
			}
			
			
			data[ fname ] = $f.is("[type='checkbox'].ss") ? ( $f.is(":checked") ? 1 : 0 ) : $f.val();
			fields[ fname ] = $f;
			setStatus($f,'wait');
			
			fieldsCount++;	
		});
		
		if( typeof onSeccess != 'function' ){
			onSeccess = function(){};				
		}
		
		if( fieldsCount > 0 ){
			try {
				function _onResponse(response){
					//if( typeof console == 'object' ){
					//	console.log( response );
					//}
					var formValid = true;
					 
					for (var f in response.valid) {
						
						if( $(fields[f]).is('.sv, .ss') ){
							response.valid[f] = true;
						}
						
						if (response.valid[f]) {
							_self.options.handlers.onFieldValid(response.valid[f], fields[f]);
						}
						else {
							var msg = false;
							formValid = false;
							if (response.messages[f]) {
								for (var msgt in response.messages[f]) {
									msg = response.messages[f][msgt];
									break;
								}
							}
							
							_self.options.handlers.onFieldInvalid(response.valid[f], fields[f], msg);
						}
					}
					
					if (formValid) {
						onSeccess();
						return true;
					}
				}
				
//				if( typeof console == 'object' ){
//					console.log( data );
//				}
				
//				$(document).ajaxError(function(event, request, settings, thrownError ){
//  						if( typeof console == 'object' ){
//							console.log( validateUrl, arguments );
//						}
// 				});

					
				$.ajax({
					dataType: 'json',
					success: _onResponse,
//					error: function( xhttp, status, error ){ 
//						if( typeof console == 'object' ){
//							console.log( validateUrl, arguments );
//						}
//					},
//					complete: function( res, status ){
//						if( typeof console == 'object' ){
//							console.log( validateUrl, arguments );
//						}
//					},
					type: 'POST',
					url: validateUrl,
					data: data
				});
				//$.post(validateUrl, data, _onResponse, 'json');
				
			} catch( e ){
			
			}
		} else {
			onSeccess();
		}
	return false;	
	}
	
	function getBindings( $field ){
		var classes = $field.attr('class').split(' ');
		var bindings = [];
		var bindRegExp = new RegExp(pregQuote( _self.options.bindClassPreffix )+"[0-9]+","g");
		
		for( var i in classes ){
			if( bindRegExp.test( classes[i] ) ){
				bindings.push( classes[i] );
			}
		}
		
	return bindings;
	}
	
	function getRelatedFields( $field ){
		var bindings = getBindings( $field );
		var $fields = $field;
		
		if (bindings.length > 0) {
			for (var i in bindings) {
				bindings[i] = '.' + bindings[i];
			}
			//$fields = $(bindings.join(', '), $field.parents('form:first'));
			
			var $list = $(bindings.join(', '),$field.parents('form:first'));
			var currentIndex = $list.index($field);
			
			$fields = $list.filter(":lt("+(currentIndex+1)+"), ."+_self.options.statusClasses.field.valid);
		}
		
		var addFields = [];
		
		$fields.each(function(){
			
			if( $(this).hasClass('fcbkcomplete') ){
				
				var i=0;
				
				while( ( $_f = $("#value-"+$(this).attr('id')+"-"+i) ).size() > 0 ){
					$vf = $_f.addClass('fckb-value').get(0);
					addFields.push($vf);
					
					i++;	
				}
				
			}
			
			if( $(this).is('input[type="checkbox"]') ){
				
				$all = $("input[name='"+$(this).attr('name')+"']");
				
				$all.each( function(){
					addFields.push($(this));
				} );	
				
			}
			
		});

		setStatus( $fields, false );
		
		for( var f in addFields ){
			$fields = $fields.add( addFields[f] );	
		}
		
	return $fields;
	}
	
	function addLogoManagment( $field ){
		
		
		$field.find("span").text('Change logo').mskI18n('text');
		$field.removeClass('mt22');
										
		if( $field.nextAll('.jQ_btn_del').size() == 0 ){
										
		$field.after( $('<button/>').addClass('jQ_btn_del btn_gray_rArr btn clr fl mt2').append(
			$("<font/>").append(
					$("<span/>").text('Suppression').mskI18n('text')
				) 
			)
			.focus( function(){ return false; } )
			.blur( function(){ return false; } )
			.click(function(){
				$(this).replaceWith('');
				$field.addClass('mt22');
				$field.find("span").text('Upload').mskI18n('text');
				$('.logoPreview img').attr('src','').addClass('dn');
				setStatus($("#logoFile").val(''),'error');
				return false;
			}) );
											
		}	
	}
	
	function validateField( $field ){
		return validateAll( getRelatedFields($field), null, false );
	}
	
	$.fn.mskFormValidate = function(){
		return this.each(function(){
			validateField($(this));
		});
	}
	
	var urlPattern = '';
	var pathBarStack = [];
	
	function _add( sender, box ){
		
		var $sender = $(sender);

		function add(text){
			$('input[name="heading"]').data('call').clear(function(){
				$('input[name="heading"]').data('call').add($sender.text());
			});
		}

		if ($('input[name="heading"]').data('call').itemsCount() > 0) {

			var $dialog = $("<div/>").addClass("warn");
	
			var box = new Boxy($dialog, {
				closeText: "",
				title: "Caution!",
				modal: true
			});
			
			$dialog.parents(".boxy-inner:first").find(".title-bar h2").mskI18n('text');
			$dialog.parents(".boxy-wrapper:first").addClass("warning");
	
			var $message = $("<span/>");
				$message.append( $("<div/>").text("You have already selected a sector in the above field.").mskI18n('text') );
				$message.append( $("<div/>").text("Are you sure you want to delete this sector and replace it with the one you have just selected?").mskI18n('text') );
			var $yesBtn = $("<button class='btn btn_green_blnk'/>").append($("<font/>").append($("<span/>").text("Yes").mskI18n('text')) ).click(function(){
				add($sender.text());
				box.hide();
				$('.boxy-wrapper').hide()
				$('.boxy-modal-blackout').hide()
			});
			
			var $noBtn = $("<button class='ml8 btn btn_gray_blnk'/>").append($("<font/>").append($("<span/>").text("No").mskI18n('text')) ).click(function(){
				box.hide();
			});
	
			$dialog.append($message).append($("<div/>").css('textAlign','center').append($yesBtn).append($noBtn));
				box.center();
			} else {
				add($sender.text());
			}

			if (typeof $dialog == 'undefined') {
				$('.boxy-wrapper').hide()
				$('.boxy-modal-blackout').hide()
			}
		return false;
	}
	
	function processMenu($list, box){
		$list.find('td a').each(function(){
			$(this).click(function(){
				loadClassification( parseInt($(this).parents("td:first[rel!='']").attr('rel')), box, $(this).text() );
			return false;
			});
		});
		
		$list.find('td span').each(function(){
			$(this).click(function(){
				_add( this, box );
			return false;
			});
		});	
			
	}
	
	function loadClassification( parent, box, parentName ){
		
		if( parent == 1 ){
			pathBarStack = [];
			pathBarStack.push({id:parent,name:'All sectors'});
		} else {
			pathBarStack.push({id:parent,name:parentName});
		}
		
		var $loader = $("<div class='dirLoader'></div>");
		box.setContent($loader);
		$loader.parents(".boxy-wrapper:first").addClass("greyBox").nextAll(".boxy-modal-blackout:first").addClass("grey");
		box.center();
		
		var url = urlPattern.replace(/\%parent\%/,parent);
		
		$.get(url, null, function(content){
			
		var $cnt = $(content);
		var $pathbar;
		
		$boxContent = $("<div/>");
		
		$boxContent.append($pathbar = $("<div>").addClass('dirPath'));
		$boxContent.append($cnt);
		box.show();
		
		processMenu($cnt, box);
		
		var separator = ' > ';
		
		for( var p in pathBarStack ){
			var $link;
			if ( pathBarStack[p].id == 1) {
				$link = $('<a href="#" class="dirRoot"/>').text("All sectors").mskI18n('text');
			} else {
				$link = $('<a href="#"/>').text( pathBarStack[p].name );
			}
			
			$($link).attr('rel',pathBarStack[p].id).click(function(){
				var tmp = [];
				var pId;
				var pName;
				
				for( var pe in pathBarStack ){
					if( pathBarStack[pe].id == $(this).attr('rel') ){
						pId = pathBarStack[pe].id;
						pName = pathBarStack[pe].name;
						pathBarStack = tmp;			
						loadClassification( pId, box, pName );
						
						break;
					} else {
						tmp.push(pathBarStack[pe]);
					}
				}
			return false;	
			});
			
		$pathbar.append( $link );
		}
		
		$link.addClass( 'current' );
		
		$pathbar.find("a + a").each(function(){
			$(this).before( $("<em/>").text(" > ") );
		});
		
		var $current = $pathbar.find("a:last");
		var lastText = $current.text();
		$current.replaceWith("<span>"+lastText+"</span>");
		
		box.setContent($boxContent);
		box.center();
			
		});
	}
	
	$.fn.mskForm = function(options){
		urlPattern = _self.options.directoryUri + '/lang/' + lang + '/parent/%parent%';
		
		return this.each(function(){
			var $this = $(this);
			var $currentForm = $(this);
			$this.data('isValid', false);
			$fields = $this.find(":input");
			
			$this.submit(function(e){
//				console.log('submit');
//				console.log($this.data('isValid'));
				
				if ($this.data('isValid')) {
					//$this.unbind('submit').get(0).submit();
					return true;
				}
				else {
					return false;
				}
			});
			
			$fields.each(function(){
			
				var $field = $(this);
				
				if ($field.hasClass('browsedir')) {
					var generated = false;
					var $boxContentCache;
					
					$field.click(function(e){
						if (e.clientX == 0 && e.clientY == 0) {
							return false;
						}
						var box = new Boxy('', {
							title: _browserTitle,
							closeable: true,
							closeText: '<img src="/public/images/close_btn_green.gif" class="mt5 mr5"/>',
							modal: true,
							show: false
						});
						
						loadClassification(1, box);
						
						return false;
					});
				}
				
				if (!$field.is('button')) {
				
					function onChange(){
						if ($(this).is(":not(input[type='submit'][type='button'], button, .tlpx, #address2)")) {
							validateField($(this));
						}
						if ($(this).is("#address2")) {
							$(this).next().removeClass('cph_error').html('');
						}
					}
				
					$field.change(onChange);
					
					if( $field.is("input[type='checkbox']") && $.browser.msie ){
						$field.click(onChange);
					}
					
					if ($field.hasClass('tlpx')) {
						var $pinput = $("<em>+" + $field.val() + "</em>").addClass('tlpx');
						$field.hide().change(function(){
							$pinput.text("+" + $(this).val());
						});
						$field.before($pinput);
					}
					
					if (!$field.hasClass('din')) {
					
					}
					else {
					
						$field.focus(function(){
							$field.focus();
						});
					}
					
					if ($field.hasClass(_self.options.statusClasses.field.required)) {
						$field.prevAll('i.rph:first').addClass('rph_ok');
					}
					
					if ($field.is('select')) {
					//$field.eposUISelect({emptyText: $field.attr('alt')});
					//$field.eposUISelect();
					}
					
				}
				if ($field.hasClass('autocomplete') && $field.attr('src') != '') {
					$field.autocomplete($field.attr('src'), options.autocomplete);
				}
				
				if ($field.hasClass('fcbkcomplete') && $field.attr('src') != '') {
					$.facebooklist($field, $field.nextAll('ul.preadded:first'), $field.nextAll('div.facebook-auto:first'), {
						url: $field.attr('src')
					}, 10, {
						userfilter: 1,
						casesensetive: 0
					}, $field.hasClass('fcbkw'), {
						deleteMessage: $field.is("[name='heading']") ? "Are you sure you want to delete this category?" : "Are you sure you want to delete this keyword?"
					}, $field.prevAll('.facebook-caption:first'));
					
				}
				
				if ($field.hasClass('logoUpload')) {
					
					if ( $('.logoPreview img').attr('src') != undefined && $('.logoPreview img').attr('src') != '' ) {
						addLogoManagment($field);
					} else {
						$('.logoPreview img').addClass('dn');
					}
					
					$field.click(function(){
					
						jQuery.get($field.attr('src'), {}, function(response){
							var form = $("<div>").append($(response));
							
							var uploadBox = new Boxy(form, {
								closeable: true,
								closeText: '<img src="/public/images/close_btn.gif"/>',
								title: _uploadTitle
							});
							
							$(form).parents(".boxy-wrapper:first").addClass("uploadLogoBox");
							
							form.find('form').submit(function(){
								var f = form.find('input[type="file"]').get(0);
								msk.uploadFile(f, function(resp){
									
									var data = eval("(" + resp + ")");
									
									form.find('.errors p').fadeOut('slow', function(){
										$(this).replaceWith('');
									});
									form.find('.errors').append($("<p></p>"));
									
									if (data.valid) {
									
										$('.logoPreview img').removeClass('dn').get(0).src = data.img;
										
										$("#logoFile").val(data.img);
										
										setStatus($field, 'ok');
										
										uploadBox.unload();
										
										addLogoManagment($field);
										
									}
									else {
										var ep = form.find('.errors');
										var messages = data.messages[$(f).attr('name')];
										for (var e in messages) {
											ep.append(ep.find('p:first').clone().hide().html(messages[e]).fadeIn());
										}
									}
									
								}, $field.attr('src'));
								return false;
							});
							
						});
						$this.data('isValid',false);
						return false;
					});
				}
				
				$field.not('.logoUpload, .browsedir, .backButton').data('showTooltip', function(){
					validateAll($fields.slice(0, $fields.index($field)));
					showTooltip.call($field.get(0));
				});
				
				$field.data('validatePrev', function(){
					validateAll($fields.slice(0, $fields.index($field)));
				});
				
				$field.not('.logoUpload, .browsedir, .backButton').data('hideTooltip', function(){
					hideTooltip.call($field.get(0));
				});
				
				$field.data('setStatus', function(status){
					setStatus($field, status);
				});
				
			}).not('.logoUpload, .browsedir, button[type="submit"], .backButton').focus(function(){
				if( $(this).is(":not(.nvp)") ){
					$prevFields = $fields.slice(0, $fields.index($(this)));
					$prevFields = $prevFields.filter(":not(input[type='checkbox'][name='"+$(this).attr("name")+"'])");
					validateAll($prevFields);
				}	
				$(this).addClass('focus');
			}).focus(showTooltip)
				.blur(function(){
				$(this).removeClass('focus');
			}).blur(hideTooltip);
			
			$this.find("a.help[href='#']").mouseenter(showTooltip).mouseleave(hideTooltip);
			
			$this.find("button[type='submit']").not(".logoUpload, .browsedir, .backButton").click(function(){
					
				$this.data('isValid',false);
				validateAll( $fields, function(){
					$this.data('isValid',true);
					//console.log($currentForm);
					$currentForm.submit();	
					//console.log('click');	
				}, false);
				
			return $this.data('isValid');
			});	
			
			
		});
	}
	
})(jQuery);

