/**
 * @author Alexey Kislyakov
*/
document.write('<script src="/js/jquery.form.js"></script>');
document.write('<script src="/js/jquery.dump.js"></script>');
document.write('<script src="/js/jquery.json.js"></script>');

$(document).ready(function () {
	$( 'form.active_form' ).each( function( index, form ){		
				//setup default event handler
				initFormElements( form );

				/* Errors in list */
				$( form ).bind( 'validate', show_errors_in_list );
				$( form ).bind( 'resetvalidate', reset_errors_in_list );
				
				/* Errors in Divs */
				$( form ).bind( 'resetvalidate', reset_errors_in_div );
				
				/* Errors in ballon */
				$( form ).bind( 'resetvalidate', reset_errors_in_baloon );
				
				init_errors_in_baloon();

		$(form).submit( function(){
			prepareFCKForSubmit();
		} );

		$(form).ajaxForm({ dataType: 'json', success: function( data ){
				$(form).trigger('datasent', data);
				if( typeof data.reload != 'undefined' ){
					location.href = location.href;
				}
				else if( typeof data.redirect != 'undefined' ){
					location.href = data.redirect;
				}
				if (typeof data.validation != 'undefined') {
					reset_validation(form);
					show_validation(data.validation, form);
				}
				
				if( typeof data.popup_message != 'undefined' )
				{
					showTimedMessage(data.popup_message, 5);
				}

				if( typeof data.custom != 'undefined' )
					eval( data.custom );

				if( typeof data.debugInfo != 'undefined' )
					alert( $( data ).dump() );
			},
			beforeSubmit: function( formData, form ){
				if( window.console )
					console.log(form.attr('method').toUpperCase() + ' to ' + form.attr('action'), formData );
			}
		});
		if( form.elements.__state && $(form.elements.__state).fieldValue() ){
			var formData;

			try{
				formData = $.secureEvalJSON( form.elements.__state.value );
			}
			catch( e ){
				if( window.console )
					console.log('Wrong state value: ', form.elements.__state.value );
				return;
			}
    	   fillForm( form, formData );
		}
		if( typeof form.id != 'undefined' )
			$(form).append( '<input type="hidden" name="__form" value="' + form.id + '" />' );
	});
});

function initFormElements( form ){
	/* Errors in list */
	$( $.makeArray(form.elements) ).unbind( 'validate' );
	$( $.makeArray(form.elements) ).bind( 'validate', show_errors_in_list );
	
	/* Errors in Divs */
	$( $.makeArray(form.elements) ).bind( 'validate', show_errors_in_div );
	
	/* Errors in ballon */
	$($.makeArray(form.elements)).bind( 'validate', show_errors_in_baloon );
}




function fillForm(form, data)
{
	$( form ).trigger( 'datapreset', data );
	$( $.makeArray(form.elements) ).each(function(index, el)
	{
		if (typeof(data[el.name]) != 'undefined') {
			$( el ).trigger('datapreset', data[el.name]);
			SetElementValue(el, data[el.name]);
		}
	});
}

function SetElementValue(el, newVal)
{
	switch(el.type)
	{
		case 'text':
		case 'select-one':
		case 'select-multiple':
		case 'password':
		case 'hidden':
		case 'button':
		case 'submit':

		if(new String(newVal) != 'null')
		el.value = newVal;
		else el.value = '';
		break;

		case 'radio':
			if ( (el.value==parseInt(newVal)) || el.value==newVal)
				el.checked = true;
		break;

		case 'checkbox':
		if(parseInt(newVal) || ( newVal != 'N' && newVal ) )
			el.checked = true;
		break;
		default:

		if(newVal && el.tagName == 'TEXTAREA')
		el.value = newVal;
		break;
	}
}

function GetElementValue(el)
{
	switch(el.type)
	{
		case 'text':
		case 'select-one':
		case 'select-multiple':
		case 'password':
		case 'hidden':
		case 'button':
		case 'submit':

		return el.value;
		break;

		case 'radio':
		case 'checkbox':
			return el.checked;
		break;
		default:

		if(el.tagName == 'TEXTAREA')
			return el.value;
		break;
	}
}

function reset_validation( form ){
	$( form ).trigger('resetvalidate');
	$( $.makeArray(form.elements) ).each( function( index, value ){
		$( form.elements[index] ).trigger('resetvalidate', value);
	} );
	$(".validation-advice", form).css( 'display', 'none' );
}

function show_validation(fields, form){
    reset_validation(form);
    
    if (!fields || fields.length == 0)
        return;

    //todo: error event fired for form
    $(form).trigger('validate', fields);

    jQuery( $.makeArray(form.elements) ).each(function(index, value){
        index = value.name;
        if (typeof fields[index] == 'undefined') 
            return;
        value = fields[index];
        if( ! value )
			return;

        //error event fired for field
        if (typeof form.elements[index] != 'undefined') {
			$(form.elements[index]).trigger('validate', value);
		}
        //show element with id advice-error_class-field or advice-error_class if 
        if (typeof value.error != 'undefined') {
            $('#advice-' + value.error + '-' + index, form).css('display', 'block');
                $('#advice-' + value.error, form).css({'display': 'block'});
        }
        $('#advice-' + index, form).css({'display': 'block'});
    });
}

function show_errors_in_list( event, data ){
	if( typeof(data) != 'undefined' && typeof data.message != 'undefiled' )//if field error
		$('.errors-list', this.form).append( data.message );
	if( this.tagName == 'FORM' && typeof data != 'undefined' && typeof data.form != 'undefined' )//if form
		$('.errors-list', this.form).append( data.form.message );
}

function reset_errors_in_list(){
	$('.errors-list', this.form).html('');
}

function show_errors_in_div( event, data ){
//alert( '#advice-for-' + this.name + '---' + $('#advice-for-' + this.name, this.form).dump() );
	if (typeof data != 'undefined' && typeof data.message != 'undefiled') {//if field error
		$('#advice-for-' + event.target.name, this.form).html(data.message);
		$('#advice-for-' + event.target.name, this.form).css({
			'display': 'block'
		});
	}
}

function reset_errors_in_div(){
	$(".validation-advice", this.form).css( 'display', 'none' );
}
/*** baloon ***/
function init_errors_in_baloon( form ){	
}

function show_errors_in_baloon( event, data ){
	if( $(this).tagName == 'FORM' )
		return;
		
	var targetElement;
	if( $(this).attr( 'validation-target' ) )
		targetElement = $($(this).attr( 'validation-target' )).get(0);
		else targetElement = this;
	
	$(this).attr( 'original_value', $(this).attr('value') );
	
    $(targetElement).bind('focus', {'data':data, 'el':this }, function(event){
		var el = event.data.el;
		var data = event.data.data;
		show_baloon( el, data );
    });
	
	$(targetElement).bind('keydown', function( event ){
		if (event.keyCode == 9) {
			var nextElement = searchNextElement(this, 'form-error', (event.shiftKey)?-1:1 );
			if (nextElement) {
				$(targetElement).trigger('blur');
				nextElement.focus();
				return false;
			}
		}
		return true;
	});

	$(targetElement).bind('blur', {'el':this }, function(event){
		var el = event.data.el;
		if ($(el).attr('original_value') !== $(el).attr('value')) {
			reset_field_error_baloon.apply(el);
		}
	});

	if ($(".form-error-message-advice", this.form).css('display') == 'none') {
		$(targetElement).focus();
	}
	$(targetElement).addClass( 'form-error' );
}

function show_baloon( el, data ){
	if( $(el).attr( 'validation-target' ) )
		el = $($(el).attr( 'validation-target' )).get(0);
	$(".form-error-message-advice", el.form).css('display', 'block');
	$(".form-error-message-advice", el.form).html(data.message);

	if( $.browser.msie && parseInt(jQuery.browser.version) == 6 )
		$(".form-error-message-advice", el.form).append('<iframe style="height: '+($(".form-error-message-advice", el.form).attr('clientHeight')-7)+'px; width: '+$(".form-error-message-advice", el.form).attr('clientWidth')+'px; filter: alpha(opacity=0); position: absolute; top: 7px; left: 0px;"></iframe>');
    
	if ($(el).attr('type') == 'hidden') {
		// some crutches for FCKeditor's hidden text field
		// if not valid field is hidden, searching for FCK frame in siblings
		var parent = $(el).parent()[0];
		var iframes = $("iframe", parent);
		for (var i = 0; i < iframes.length; i++) {
			if ($(iframes[i]).css('display') != 'block') {
				el = iframes[i];
				if (window.console) console.log("");
				break;				
			}
		}

		$(".form-error-message-advice", el.form).css('left', ($(el)[0].offsetLeft + $(el)[0].offsetWidth - 30 + 2) + "px");
		$(".form-error-message-advice", el.form).css('top', ($(el)[0].offsetTop + $(el)[0].offsetHeight  - 8 + 2) + "px");
		$(".form-error-message-advice", el.form).css("margin-top: 0px;")
		return;
	}

	if ($.browser.msie){
		if (window.console){
			console.log('');
			
			console.log(
			$(el).offset(),
			{width: $(el).width(), height: $(el).height()},
			$(el).css("padding")
			);

			console.log(
			$(el.form).offset(),
			{width: $(el.form).width(), height: $(el.form).height()},
			$(el.form).css("padding")
			);
		}
		

		$(".form-error-message-advice", el.form).css('top',  ($(el).offset().top  - $(el.form).offset().top + $(el).height() - 8 + 4) + "px");
		$(".form-error-message-advice", el.form).css('left', ($(el).offset().left - $(el.form).offset().left + $(el).width() - 30 + 4) + "px");
	}
	else{
		$(".form-error-message-advice", el.form).css('left', ($(el)[0].offsetLeft + $(el)[0].offsetWidth - 30 + 2) + "px");
		$(".form-error-message-advice", el.form).css('top', ($(el)[0].offsetTop + $(el)[0].offsetHeight  - 8 + 2) + "px");
	}

}

function reset_field_error_baloon(/* this = form element */){
	var targetElement;
	if( $(this).attr( 'validation-target' ) )
		targetElement = $($(this).attr( 'validation-target' )).get(0);
		else targetElement = this;

	$(targetElement).unbind('focus').unbind('blur').removeClass( 'form-error' );
	reset_baloon.apply( this.form );
}

function reset_baloon(/* this = form */){
	$(".form-error-message-advice", this).empty();
	$(".form-error-message-advice", this).css( 'display', 'none' );
}

function reset_errors_in_baloon(/* this = form */){
	$($.makeArray(this.elements)).removeClass( 'form-error' );
	for( var i = 0; this.elements.length > i; i++ )
		$($(this.elements[i]).attr( 'validation-target' )).removeClass( 'form-error' );
	reset_baloon.apply( this );
}


function searchNextElement(el, class_name, duration){
	try {
		var elements = el.form.elements;
	}
	catch(e){ return null; }
	var elements2 = new Array();

	if (class_name) {
		for (var i = (duration>0)?0:elements.length; (duration>0 && i < elements.length) || (duration < 0 && i >= 0 ); i+=duration) 
			if ($(elements[i]).hasClass(class_name)) 
				elements2[elements2.length] = elements[i];
		elements = elements2;
	}
	
	if(typeof el.tabIndex != 'undefined')
	{
		var curIndex = el.tabIndex;
		var arrIndex = -1;
		for (var i = 0; i < elements.length; i++)
		{
			if (typeof elements[i].tabIndex != 'undefined' && elements[i].tabIndex > curIndex && (!class_name || $(elements[i]).hasClass(class_name) )) {
				if(arrIndex < 0 || elements[arrIndex].tabIndex > elements[i].tabIndex)
					arrIndex = i;
				if ((elements[i].tabIndex - curIndex) == 1)
					break;
			}
		}
		if(arrIndex > 0)
			return $(elements[arrIndex]);
	}

//	var curIndex = elements.indexOf(el);
	var curIndex;
	for( var i = 0; i < elements.length; i++ )
		if( elements[i] == el ){
			curIndex = i;
			break;
		}


	if (curIndex < (elements.length - 1)) {
		return $(elements[curIndex + 1]);
	}
	else {
		if (class_name) {
				return $('.' + class_name + ':' + ((duration > 0)?'first':'last'), el.form);

			
		}
		else {
			return null;
		}
	}
}



var __fcksEditorsArray = new Array();
// called when FCKeditor is done starting..
function FCKeditor_OnComplete( editorInstance ){
		__fcksEditorsArray[__fcksEditorsArray.length] = editorInstance;
		$(editorInstance.LinkedField).trigger('fck:onload', editorInstance);
}

function prepareFCKForSubmit(){
	jQuery( __fcksEditorsArray).each( 
	function( i, fck ){ 
		fck.LinkedField.value = fck.GetHTML() 
	});
}

/***Fixing Array Index Of***/
[].indexOf || (Array.prototype.indexOf = function(v,n){
	n = (n==null)?0:n; var m = this.length;
		for(var i = n; i < m; i++)
			if(this[i] == v)
				return i;
		return -1;
	});

function showTimedMessage( text, timer ){
	if( ! timer ) timer = 5;
	var win = new Boxy("<p>" + text + "</p>", {title: "Will close in " + timer});
	var cbtimer;
	setTimeout( cbtimer = function(){
		if (timer == 0) 
			win.hide();
		else {
			timer--;
			win.setTitle('Will close in ' + timer);
			setTimeout( cbtimer, 1000 );
		}
	}, 1000 );
}

function pub( section, extendparam ){
	if( ! extendparam ) extendparam = '';
	$.getJSON("/admin.php/publish/do_action/" + section + '/' + extendparam, function(json){
		showTimedMessage( 'The data has been successfully published' );
	});
}
