(function( $ ){
    /**
     * Hidden Elements Values:
     *      If wanted to get hidden element value give it a class "gfv_readable".
     *      
     * @return JSObject with pairs {field_name: field_value}
     * @author Michał Stelmak
     * @version 1.0.2
     */
    $.fn.getFieldValues = function(){
        var $form = $(this);
        var els = $form.find('input[type="text"], input[type="hidden"], input[type="checkbox"], input[type="radio"], select, textarea, input[type="password"]');
        var options = {};
        var arrayDetected = false;
        $.each(els, function(){
            if($(this).is(':hidden') && !$(this).hasClass('gfv_readable'))
                return;
            
            arrayDetected = false;
            if(this.name.substr(this.name.length-2, 2).indexOf('[]') === 0)
                arrayDetected = true;
            
            function insertData(val, name, options, arrayDetected){
                if(arrayDetected){
                    if(typeof options[name] != 'object')
                        options[name] = [];
                    options[name].push(val);
                }
                else
                    options[name] = val;
                
                return options;
            }

            if(this.type == 'checkbox'){
                if($(this).is(':checked'))
                    options = insertData(1, this.name, options, arrayDetected);
                else 
                    options = insertData(0, this.name, options, arrayDetected);
            }
            else if(this.type == 'radio'){
                if(this.checked == true)
                    options = insertData($(this).val(), this.name, options, arrayDetected);
            }
            else{
                options = insertData($(this).val(), this.name, options, arrayDetected);
                //geting label of selected item
                if(this.type == 'select' || this.type == 'select-one')
                    options = insertData($(this).find('option:selected').text(), this.name+'_label', options, arrayDetected);
            }
            
        });
        return options;
    }
})( jQuery );

(function( $ ){
    /**
     * Appending element with "errors" class below the elements.
     * 
     * @param options - object containing all aptions described below
     * @param data - object with data, pairs {field_name: error_message}
     * @param zend_array - defining if data is got by Zend_Form::getMessages() (default true)
     * 
     * @author Michał Stelmak
     * @version 1.1.0
     */
    $.fn.updateFieldErrors = function(options){

        var settings = {
            data: {},
            zend_array: true,
            eppe_cms: false
        };
        if ( options )
            $.extend( settings, options );
        
        if(settings.zend_array && settings.eppe_cms)
        {
            var fieldName;
            var section;
            var element;
            var message;
            for(key in settings.data)
            {
                fieldName = key;
                //getting real value of message
                for(code in settings.data[key])
                {
                    message = settings.data[key][code];
                    break;
                }
                    
                element = $(this).find('[name="'+fieldName+'"]');
                section = element.closest('section');
                if(!section.hasClass('error'))
                    section.addClass('error');
                
                //use tipsy for a tooltip
                console.log(element);
                element.tipsy({
                    trigger: 'manual',
                    fallback: message,
                    gravity: 'nw'
                    
                });
                element.tipsy('show');

                //hide tooltip in fieldfocus
                element.bind('focus.tooltip, click.tooltip', function () {
                    $(this).unbind('focus.tooltip, click.tooltip').tipsy('hide');
                });
                
            }
                
        }
        else if(settings.zend_array && !settings.eppe_cms){
            var fieldName;
            var element;
            var error_ul;
            var message;
            for(key in settings.data)
            {
                fieldName = key;
                //getting real value of message
                for(code in settings.data[key])
                {
                    message = settings.data[key][code];
                    break;
                }
                    
                element = $(this).find('[name="'+fieldName+'"]');
                error_ul = element.parent().find('.errors');
                if(error_ul.length == 0){//in no .error ul exists
                    error_ul = $('<ul></ul>').addClass('errors').append('<li></li>');
                    element.parent().append(error_ul);
                }
                error_ul.find('li').html(message);
            }
        }
        else throw 'There is no functionality to handle non-zend data yet!';
    }
})( jQuery );
    
(function( $ ){
    /**
     * Finding elements with class "errors" (by default) and removing it
     * 
     * @param eppe_cms - if form is in eppe cms
     * @param options - object containing all aptions described below
     * @param (optional)err_class - name of class to find
     * 
     * @author Michał Stelmak
     * @version 1.0.0
     */
    $.fn.clearFieldErrors = function(options){
        var settings = {
            eppe_cms: false,
            err_class: 'errors'
        };
        if ( options )
            $.extend( settings, options );
        if(settings.eppe_cms)
        {
            var els = $(this).find('[original-title=""]');
            if(els.length != 0)
            {
                $.each(els, function(){
                    $(this).tipsy('hide');
                    $(this).removeAttr('original-title');
                });    
            }
            $(this).find('section.error').removeClass('error');
        }
        else
            $(this).find('.'+settings.err_class).remove();
    }
})( jQuery );

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}

(function( $ ){
    var namespace = 'hideableLabel_';
    /**
         * default_label: [label different than current to set when not focused],
         * color: [color to set when focused]
         */
    $.fn.hideableLabel = function( options ){
        var settings = {
            default_label: null,
            color_chosen: null,
            color_default: null
        };
        if ( options )
            $.extend( settings, options );
        
        $.each(this, function(){
            //setting data to object for later use
            var new_data = {};
            if(settings.default_label == null)
                new_data.old_val = $(this).val();
            else
                new_data.old_val = settings.default_label;
            if(settings.color_chosen != null)
                new_data.color_chosen = settings.color_chosen;  
            if(settings.color_default != null)
                new_data.color_default = settings.color_default;
            else
                new_data.color_default = $(this).css('color');
            
            $(this).data(namespace+'old_data', new_data);
            
            $(this).focus(function(){
                var old_data = $(this).data(namespace+'old_data');
                if($(this).val() == old_data.old_val)
                {
                    if(old_data.color_chosen)
                        $(this).css('color', old_data.color_chosen);       
                    $(this).val('');
                }
            });
            
            $(this).blur(function(){
                if($(this).val() == '')
                {
                    var old_data = $(this).data(namespace+'old_data');
                    if(old_data.color_default)
                        $(this).css('color', old_data.color_default);
                    $(this).val(old_data.old_val);
                }
            });
        });
    }
})( jQuery );

(function( $ ){
    /**
     * Attaching ajax to the form.
     * 
     * @param eppe_cms - if form is in eppe cms
     * 
     * @author Michał Stelmak
     * @version 1.0.0
     */
    $.fn.ajaxifyForm = function( options ){
        var ajaxifiedFormRunning = false;
        
        var $form = $(this);
        var form = this;
        var button = $form.find('submit');
        if(button.length == 0)
            button = $form.find('button');
        if(button.length == 0)
            button = $form.find('input[type="submit"]');
        if(button.length == 0)
            button = $form.find('input[type="button"]');
        
        //setting options
        var settings = {
            eppe_cms: false,
            url: $form.attr('action') ? $form.attr('action') : window.location.href,
            onSuccess: function(){}
        };
        if ( options ) $.extend( settings, options );
        //end-of setting options
        
        //adding upload functionality
        $.each($form.find('input[type="file"]'), function(){
            var $file = $(this);
            var filesCount = 0;
            new qq.FileUploaderBasic({
                action: '/admin/upload/ajax-upload',
                button: this,
                onComplete: function(id, fileName, responseJSON){
                    filesCount++;
                    if(!$file.attr('multiple')) $file.parent().parent().find('div.display_container .removing_image').click();//clearing existing image
                    //hidden inputs manage
                    var container = $file.parent().find('span.files_container');
                    if(container.length == 0)
                        container = $('<span></span>').css('display', 'none').attr('class', 'files_container').appendTo($file.parent());
                    if(!$file.attr('multiple')) container.find('input').remove();//clearing existing images
                    $('<input type="hidden" id="im_contain_'+filesCount+'" name="'+$file.attr('name')+'__file_path'+($file.attr('multiple')?'[]':'')+'" class="gfv_readable" />').val(responseJSON.file_path).appendTo(container);
                    
                    //display images box manage
                    var display_container = $file.parent().parent().find('div.display_container');
                    if(display_container.length == 0){
                        display_container = $('<div><ul></ul></div>').attr('class', 'display_container').appendTo($file.parent().parent());
                        $('<h6>Files list:</h6>').attr('class', 'display_container_head').prependTo(display_container);
                    }
                    if(!$file.attr('multiple')) display_container.find('li').remove();//clearing existing images
                    var last_added = $('<li id="im_prev_'+filesCount+'"><a class="image_action" href="/'+responseJSON.file_path+'">'+fileName+'</a></li>').appendTo(display_container.find('ul'));
                    var preview = $('<a class="image_preview" href="/'+responseJSON.file_path+'"><img title="Preview" src="/images/admin/icons/light/magnifying_glass.png" /></a>').fancybox().appendTo(last_added);
                    var remove = $('<a class="removing_image" href="javascript:void(null)"><img title="Remove" src="/images/admin/icons/light/trashcan.png" /></a>').appendTo(last_added);
                    remove.click(function(){
                        var $this = $(this);
                        var id = $this.closest('li').attr('id').split('_')[2];
                        $.ajax({
                            url: '/admin/upload/ajax-remove-image',
                            type: 'post',
                            dataType: 'json',
                            data: {file: $this.parent().find('a.image_preview').attr('href')},
                            success: function(result){
                                if(result.success){
                                    $this.closest('.display_container').prev('#uniform-files').find('input#im_contain_'+id).remove();
                                    $this.closest('li').remove();
                                }
                                else{
                                    alert('Can not remove file');
                                }
                            },
                            error: function(){
                                alert('Request Error!');
                            }
                        });
                    });
                },
                multiple: $file.attr('multiple')?true:false
            });
        });
        
        $form.submit(function(){
            if(ajaxifiedFormRunning)
                return false;
            else
                ajaxifiedFormRunning = true;
            $.ajax({
                url: settings.url,
                type: 'post',
                dataType: 'json',
                data: $form.getFieldValues(),
                beforeSend: function(){
                    button.attr('disabled', 'disabled');
                    $form.clearFieldErrors({
                        eppe_cms: settings.eppe_cms
                    });
                },
                success: function(result){
                    if(result.success)
                        settings.onSuccess();
                    
                    if(result.success == 'message' || result.error == 'message')
                    {
                        if(settings.eppe_cms)
                        {
                            $.alert(result.message.content, {
                                dialogClass: result.message.dialogClass?result.message.dialogClass:'ui-dialog-type-clean',
                                resizable: false,
                                text: {
                                    header: result.message.title
                                }, 
                                buttons: [{
                                    text: 'OK',
                                    click: function () {
                                        $(this).dialog('close');
                                        $('#wl_dialog').remove();
                                    }
                                }]
                            });
                        }
                    }
                    else if(result.success)
                    {
                        if(result.success == 'close_fancybox')
                            $.fancybox.close();
                        if(result.success == 'redirect')
                            window.location = result.url;
                    }
                    else if(result.error)
                    {   
                        if(result.error == 'invalid')
                        {
                            $form.updateFieldErrors({
                                data: result.data,
                                eppe_cms: settings.eppe_cms
                            });
                        }   
                    }
                    ajaxifiedFormRunning = false;
                    button.removeAttr('disabled');
                },
                error: function(){
                    alert('Request Error!');
                    //alert(data);
                    ajaxifiedFormRunning = false;
                    button.removeAttr('disabled');
                }
            });
            return false;
        });
    }
        
})( jQuery );
