// more/less
function more(containerID) {
  //  var wrapper = jQuery("#" + containerID);
 //   jQuery(".more", wrapper).hide();
  //  jQuery(".less", wrapper).fadeIn();
 //   jQuery(".dots", wrapper).hide();
 //   jQuery(".secondpart", wrapper).fadeIn();
 $('#'+containerID + ' .more').hide();
 $('#'+containerID + ' .less').show();
 $('#'+containerID + ' .dots').hide();
 $('#'+containerID + ' .secondpart').show();
}

function less(containerID) {
   // var wrapper = jQuery("#" + containerID);
   // jQuery(".less", wrapper).hide();
   // jQuery(".more", wrapper).fadeIn();
   // jQuery(".secondpart", wrapper).fadeOut(function(){
   //     jQuery(".dots", wrapper).fadeIn();
  //  });
  
 $('#'+containerID + ' .more').show();
 $('#'+containerID + ' .less').hide();
 $('#'+containerID + ' .dots').show();
 $('#'+containerID + ' .secondpart').hide(); 
}

// firebug console
function log(data) {
    try {
        console.log(data);
    }
    catch (e) {}
}

// jQuery extends
jQuery(function(){

    //dropdowns
	$('.dropdown-trigger').live('click', function(){return false});
	
	$('.dropdown-trigger').live('mouseover',function(){
	    $('.dropdown-values').not($(this).parent().find('.dropdown-values')).hide();
		$(this).parent().find('.dropdown-values').show('fast');
		$(this).addClass('dropdown-trigger-down');
	});
	
	$(".dropdown").live('mouseleave',function(){
		$(this).find('.dropdown-trigger').removeClass('dropdown-trigger-down');
        $(this).find('.dropdown-values').fadeOut();
    });

    // alerter
    jQuery.blink = function(message, timeout) {
        jQuery("#alert_message").text(message).alignCenter().show();
        setTimeout(function(){
            jQuery("#alert_message").hide().text("");
        }, timeout*1000);
    };

    // align element at window center
    jQuery.fn.alignCenter = function() {
        var marginLeft = Math.max(15, parseInt(jQuery(window).width()/2 - jQuery(this).innerWidth()/2));
        var marginTop  = Math.max(15, parseInt(jQuery(window).height()/2 - jQuery(this).innerHeight()/2));

        return jQuery(this).css({"top":marginTop + "px", "left":marginLeft + "px"});
    };

    // form ajax submit
    jQuery.fn.ajaxPaginator = function(paginator)
    {
        // get $target options
        var $target = this;
        var options = $target.data('ajaxbox-options');
        if (!options.pagination) return;
       
        var pagination = $(options.pagination.controller);
        
        if(paginator == 'refreshPage'){
            $target.ajaxBox(options);
            return;
        }
        
        if(paginator == 'refreshPageSilent'){
            $target.ajaxBoxSilent(options);
            return;
        }
        
        if(paginator == 'isActive'){
            return ($(".currentpage:visible").length > 0);
        }

        if (paginator.pageCount > 1) {
            pagination.show();
        }
        else {
            pagination.hide();
        }
        
        // set type of box loading: silent or not 
   		var ajaxBox = (options.pagination.type == 'silent') ? function() {$target.ajaxBoxSilent(options);}
   			: function() {$target.ajaxBox(options);};

        // unbind handlers
        pagination.children().unbind();

        // bind switch to previous
        if (!paginator.previous) {
            $(".prevpage", pagination).children(".arrow").addClass("disabled");
        } else {
            $(".prevpage", pagination).bind('click', function() {
                options.request.p = paginator.previous;
                //$target.ajaxBox(options);
                ajaxBox();
            }).children(".arrow").removeClass("disabled");
        }

        // bind switch to next
        if (!paginator.next) {
            $(".nextpage", pagination).children(".arrow").addClass("disabled");
        } else {
            $(".nextpage", pagination).bind('click', function() {
                options.request.p = paginator.next;
                //$target.ajaxBox(options);
                ajaxBox();
            }).children(".arrow").removeClass("disabled");
        }

        // bind page text
        $(".currentpage", pagination)
            .change(function(){
                var gotopage = parseInt($(".currentpage", pagination).val());
                if (gotopage != paginator.current && (gotopage >= paginator.first && gotopage <= paginator.last)) {
                    paginator.current = options.request.p = gotopage;
                    //$target.ajaxBox(options);
                    ajaxBox();
                }
            })
            .click(function(){
                $(this).select();
            })
            .keypress(function(event){
                if (event.which === 13) {
                    event.preventDefault();
                    $(this).blur().trigger('change');
                }
            });

        $(".currentpage", pagination).val(paginator.current);
        $(".currentpage", pagination).text(paginator.current);
        $(".totalpages", pagination).text(paginator.pageCount);

        // listing
        if (options.pagination.listing) {
            if (paginator.totalItemCount > 0) {
                $(options.pagination.listing).html("<strong>" + paginator.firstItemNumber + "-" + paginator.lastItemNumber + "</strong> of <strong>" + paginator.totalItemCount + "</strong>").show();
            }
            else {
                $(options.pagination.listing).hide();
            }
        }

        // callback
        if (options.pagination.callback) {
            options.pagination.callback(paginator);
        }

        return this;
    }

    // jQuery plugins
    jQuery.fn.extend({
        // ajax form
        ajaxForm: function(options)
        {
            AppForm.enable(this, options);
            return this;
        },
        // ajax box
        ajaxBox: function(options)
        {
            AppAjaxBox.init(this, options || null);
            return this;
        },
        ajaxBoxSilent: function(options)
        {
            AppAjaxBoxSilent.init(this, options || null);
            return this;
        }
    });
});

// Plugin: Ajax box
var AppAjaxBox = {
    // load content into box
    init: function(target, options) {
        if (options !== null) {
            target.data('ajaxbox-options', options);
        }
        else {
            options = target.data('ajaxbox-options');
        }

        // prevent multiple requests
        if (target.data('ajaxbox-process') || target.data('ajaxbox-error')) return;

        // request data
        jQuery.ajax({
            beforeSend: function() {
                target.data('ajaxbox-process', true);
                AppAjaxBox.enable(target);
            },
            complete: function(xhr) {
                target.data('ajaxbox-process', false);
                AppAjaxBox.disable(target);
            },
            error: function(xhr) {
                if (xhr.status === 0) return;
                target.data('ajaxbox-error', true);
                AppAjaxBox.disable(target);
                jQuery.blink('Application error', 5);
            },
            url: options.url,
            cache: false,
            type: 'get',
            data: options.request,
            dataType: 'html',
            success: function(response) {
                target.html(response);
            }
        });

        return this;
    },
    // loading
    enable: function(target)
    {
        target.empty();
        jQuery("#loading").clone().attr("id", "_loading_" + target[0].id).appendTo(target).show();
    },
    disable: function(target)
    {
        jQuery("#_loading_" + target[0].id).remove();
    }
};

//Plugin: Ajax box
var AppAjaxBoxSilent = {
    // load content into box
    init: function(target, options) {
        if (options !== null) {
            target.data('ajaxbox-options', options);
        }
        else {
            options = target.data('ajaxbox-options');
        }

        // prevent multiple requests
        if (target.data('ajaxbox-process') || target.data('ajaxbox-error')) return;

        // request data
        jQuery.ajax({
            beforeSend: function() {
                target.data('ajaxbox-process', true);
            },
            complete: function(xhr) {
                target.data('ajaxbox-process', false);
            },
            error: function(xhr) {
                if (xhr.status === 0) return;
                target.data('ajaxbox-error', true);
                jQuery.blink('Application error', 5);
            },
            url: options.url,
            cache: false,
            type: 'get',
            data: options.request,
            dataType: 'html',
            success: (typeof options.success !== 'undefined') ? options.success : function(response) {
           		target.html(response);
            }
        });

        return this;
    }
};


// Ajax loading
var ajaxLoading = {
    enable: function(target)
    {
        if (!target) {
            jQuery("#loading").alignCenter().show();
        }
        else {
            jQuery("#loading").alignCenter(target).show();
        }
    },
    disable: function(target)
    {
        if (!target) {
            jQuery("#loading").hide();
        } else {
            jQuery("#loading").hide();
        }
    }
};

// Form class
var AppForm = {
    enable: function(form, options)
    {
        // bind ajax_submit to form
        form.bind('ajax-submit', function(event){
            AppForm.submit(this, options);
        });

        // bind submit handler
        jQuery(".ajax_submit", form).click(function(event){
            event.preventDefault();
            if (options.preSubmit) {
                options.preSubmit();
            }
            form.trigger('ajax-submit');
        });

        // bind cancel handler
        if (options.cancel == "AppPopup.close") {
            jQuery(".ajax_cancel", AppPopup.container).click(function(event){
                event.preventDefault();
                AppPopup.close();
            });
        }
    },
    submit: function(form, options)
    {
        var $form = jQuery(form);

        // prevent multiple requests
        if ($form.data('ajaxform-process') || $form.data('ajaxform-error')) return;

        // can use uploading?
        if (typeof options.upload === 'undefined') {
            options.upload = true;
        }

        if (options.upload && $form.find("input[type=file]").length !== 0) {
            var uid = form.id + '_container';
            var iframe = jQuery("<iframe src='javascript:false;' id='" +uid+ "' name=" +uid+ " style='display:none' />");
            iframe.appendTo('body');

            form.action  = options.action;
            form.target  = uid;
            form.method  = "post";
            form.enctype = "multipart/form-data";

            $form.data('ajaxform-process', true);
            form.submit();

            var iframeDelete = false;

            iframe.load(function(){
                $form.data('ajaxform-process', false);

                // delete iframe
                if (iframeDelete) {
                    setTimeout(function(){
                        iframe.remove();
                    }, 0);
                    return;
                }

                // set response
                var response = $(this).contents().text();

                if (jQuery.trim(response) === '') {
                    var xhr = {result:false, response:{}, request: {}};
                    jQuery.blink('Application error', 5);
                }
                else {
                    try {
                        var xhr = eval('('+response+')');
                    } catch(e) {
                        var xhr = {result:false, response:{}, request: {}};
                        jQuery.blink('Application error', 5);
                    }
                }

                AppForm.response($form, xhr.response);
                if (options.callback) {
                    options.callback(xhr);
                }

                iframeDelete = true;
                this.src = '<html></html>';
            });
        }
        // simple ajax send
        else {
            // form data
            var request = new Object();
            /*jQuery.each(form.elements, function(k, field) {
                var name = field.name, type = field.type, tag = field.tagName.toLowerCase();

                // filter fields
                if (!name || field.disabled ||
                type == 'reset' || type == 'button' || type == 'submit' || type == 'file' ||
                ((type == 'checkbox' || type == 'radio') && !field.checked) ||
                (tag == 'select' && field.selectedIndex == -1)) return;

                request[field.name] = field.value;
            });*/
            if (options.beforeSend) {
                options.beforeSend();
            }
            request = $(form).serialize();
            // custom request parameters
            if (options.request) {
                jQuery.extend(request, options.request);
            }
            // send form data
            jQuery.ajax({
                beforeSend: function() {
                    $form.data('ajaxform-process', true);
                    ajaxLoading.enable($form);
                },
                complete: function(xhr) {
                    $form.data('ajaxform-process', false);
                    ajaxLoading.disable($form);
                },
                error: function() {
                    $form.data('ajaxform-error', true);
                    jQuery.blink('Application error', 5);
                },
                url: options.action,
                cache: false,
                type: 'post',
                data: request,
                dataType: 'json',
                success: function(xhr) {
                    AppForm.response($form, xhr.response);
                    // user callback
                    if (options.callback) {
                        options.callback(xhr);
                    }
                }
            });
        }
    },
    response: function(form, response)
    {
        // remove errors
        form.parent().prev().hide().empty();
    	jQuery('div.error', form).removeClass('error').addClass('noerrors')
            .next().hide().empty();

        // if has messages, showing it
        jQuery.each(response, function(element, errors){
            // make errors block
            var errstr = '<ul class="errors">';
            jQuery.each(errors, function(key, message){
                errstr += '<li>' + message + '</li>';
            });
            errstr += '</ul>';

            // append errors block to element
            if (element !== 'form') {
                jQuery('.' + element + '_errors', form).html(errstr).show()
                    .prev().removeClass('noerrors').addClass('error');
            }
            else {
                $("#" + form[0].id + "_errors").html(errstr).show();
            }
        });
    }
}

// Effects class
var AppEffects = {
    // block slide animation
    blockToggle: function(target)
    {
        jQuery(".arrow", target).toggleClass("arrow-open").toggleClass("arrow-closed")
        jQuery(target).next().slideToggle("slow");
    },
    // slide animation
    slideToggle: function(target)
    {
        if (typeof target === 'string') {
            jQuery(target).slideToggle('fast');
        }
    },
    // button press animation
    buttonToggle: function(target)
    {
        if (jQuery(target).hasClass("disabled")) return;
        jQuery(":first", target).toggleClass("upstate").toggleClass("downstate");
    },
    buttonUpState: function(target)
    {
        if (jQuery(target).hasClass("upstate")) return;
        jQuery(":first", target).addClass("upstate");
    },
    // tooltip
    tooltip: function(target, balloon)
    {
        jQuery(target).after(' (<span class="moreinfo">More info...</span>)')
            .next().bind("mouseenter mouseleave", function(){
                jQuery(balloon).toggle();
            });
    }
};

var AppAjax = {
    get: function(target, options)
    {
        if (!options.url) return;

        // params
        var $target = jQuery(target),
                uid = target.id,
                request = options.request || null,
                url = options.url,
                type = options.type || 'get',
                dataType = options.dataType || 'json';

        // prevent multiple requests
        if ($target.data(uid + "process") || $target.data(uid + "error")) return;

        // ajax
        $.ajax({
            beforeSend: function() {
                $target.data(uid + "process", true);
                ajaxLoading.enable();
            },
            complete: function(xhr) {
                $target.data(uid + "process", false);
                ajaxLoading.disable();
            },
            error: function(xhr) {
                if (xhr.status === 0) return;
                $target.data(uid + "error", true);
                jQuery.blink('Application error', 5);
            },
            url: url,
            cache: false,
            type: type,
            data: request,
            dataType: dataType,
            success: function(xhr) {
                if (options.callback) options.callback(xhr);
            }
        });
    }
};

// Popup class
var AppPopup = {
    container: null,
    // showPopup
    open: function(name, request)
    {
        if (this.container !== null) {
            //this.close();
        }
        var data = request || {};

        // show fade
        jQuery("#opaco").height(jQuery(document).height()).show().fadeTo("slow", 0.7);

        // get popup contents through ajax
        this.container = jQuery("#popup");

        jQuery.ajax({
            beforeSend: function() {
                AppPopup.enable();
            },
            complete: function(xhr) {
                AppPopup.disable();
            },
            error: function(xhr) {
                if (xhr.status === 0) return;
                jQuery.blink('Application error', 5);
                AppPopup.disable();
            },
            url: '/' + name.replace(/_/g, '/'),
            cache: false,
            data: data,
            dataType: 'html',
            success: function(content){
                AppPopup.container.html(content);
                AppPopup.alignCenter(AppPopup.container);
                AppPopup.container.show();
                jQuery(document).bind("keyup", AppPopup.keyPress);
            }
        });
    },
    // hidePopup
    close: function()
    {
        if (this.container === null) return;

        // hide and empty container
        this.container.animate({height:0, top: '+='+this.container.height()/2}, 400, function(){
            AppPopup.container.attr('style','');
            AppPopup.container.empty();
            AppPopup.container = null;
            // hide fade
            jQuery("#opaco").hide();
            // bind esc close window
            jQuery(document).unbind("keyup", AppPopup.keyPress);
        });
        
    },
    // handler for keypress event
    keyPress: function(event)
    {
        // 'esc' key
        if (event.which == 27) {
            AppPopup.close();
        }
    },
    // loading
    enable: function()
    {
        jQuery("#loading").alignCenter().show();
    },
    disable: function()
    {
        jQuery("#loading").hide();
    },
    // align
    alignCenter: function(target)
    {
        var marginLeft = Math.max(15, parseInt(jQuery(window).width()/2 - jQuery(target).innerWidth()/2));
        var marginTop  = Math.max(15, parseInt(jQuery(window).height()/2 - jQuery(target).innerHeight()/2));
        var scrollTop  = parseInt(jQuery(window).scrollTop());
        marginTop = marginTop + scrollTop;

        return jQuery(target).css({"top":marginTop + "px", "left":marginLeft + "px"});
    }
};

$(document).ready(function () {
 
$('.tiptrigger').mouseover(function() {
  $(this).find('.tip').show('slow');
});

$('.tiptrigger').mouseout(function() {
  $(this).find('.tip').hide('slow');
});
 
$('.withtooltip').live('mouseover', function() {
   $this = $(this);
   $('#tooltip').clone().attr("id", "").appendTo(this);
   $this.find('.tipMid').html($(this).attr('title'));
   $this.attr('rel', $(this).attr('title'));
   $this.attr('title', "");
   $this.find('.tip').fadeIn(); 
});

$('.withtooltip').live('mouseout', function() {
	$this = $(this);
	$this.attr('title', $(this).attr('rel'));
	$this.find('.tip').remove();
});
/*
$('.withtooltip').toggle(
	function() {
		$this = $(this);
		$('#tooltip').clone().attr("id", "").appendTo(this);
		$this.parent().find('.tipMid').html($(this).find('.tooltip-content').html());
		$this.parent().find('.tip').fadeIn();
	},
	function() {
		$this = $(this);
		$this.find('.tip').remove();
	}
);
*/
 
return false;
});

