/** 13.11.2010.
*   Автор: Коршунов С.Е.
*   Расширение форматирует текст в соответствии с размерами области в которую он помещается.
*   Параметры :
*               debug    : true или false (
*                                            если true 
*                                                     a) 1 - то вывод в отладочном окне 
*                                                     б) 2 - то alert
*                                         )
*               number   : число - сколько строк выводим 
*               flaf_    : true или false оставляем тэги и пробелы внутри текста или нет
*               language : 'ru' или всё что угодно. Определяем алфавит.
*               point    : '.' символы в конце  предложения.
*               count    : 5 число символов в конце предложения
*               parent   :'div#ttt' элемент относительно которого надо считать ширину.Селектор jQuery

*
*   Вызов с параметрами по умолчанию -  $("оборачиваемый элемент").jExtends_KSE();         
*   Вызов с параметрами              -  $("оборачиваемый элемент").jExtends_KSE(
*                                        {
*                                            language  :'en',
*                                            flag_tags :true,
*                                            flag_nbsp :true,
*                                            debug     :2                                            
*                                        }
*                                    );
*/
//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//Массивобрабатываемых объектов
  var Extends_KSE_StringSplit_This   = Array(); 
  var Extends_KSE_StringSplit_AllObj = Array();

//Счётчики
  var Extends_KSE_StringSplit_count = 0;
  var Extends_KSE_StringSplit_k     = 0;  
  
(
    function(){
        $.fn.jExtends_KSE_StringSplit = function(params)
            {                   
                //Окошко с отладочной информацией
                var div = '<div id="window"><div id="windowTop">';
                    div+= '<div id="windowTopContent">Отладочное окно</div></div>';  
                    div+= '<img src="/common/osl/js/interface/window_close.jpg" id="windowClose" />';
                    div+= '<div id="windowBottom"><div id="windowBottomContent">&nbsp;</div></div>';
                    div+= '<div id="windowContent">Содержание всплывающего окна</div>';
                    div+= '<img src="/common/osl/js/interface/window_resize.gif" id="windowResize" /></div>';
                                    
                //Настройки по умолчанию.
                params = $.extend
                    (
                        {
                            number     : 2,                //Колличество - сколько строк выводим
                            flag_nbsp  : false,            //Флаг - сохраняем ли &nbsp;
                            flag_tags  : false,            //Флаг - сохраняем ли теги ;                                                        
                            language   : 'ru',             //Язык текста.
                            count      : 3,                //Кол-во символов в конце
                            point      : '.',              //Какие символы используются.
                            debug      : false,
                            parent     : false                            
                        }, params || {}
                    );
                                                                        
                //Обработчик закрытия отладочного окна.    
                $('#windowClose').live('click',
                                            function()
                                               {
                                                   $('#window').fadeTo(100,0,function()
                                                   {
                                                       $(this).hide().remove().empty(); 
                                                   });
                                               }
                                        ); 
                //Перебираем каждый элемент                                               
                this.each
                    (
                        function()
                            {   
                                //HTML текст (сохраняем всё форматирование)!!!! который надо обработать.Определяем ширину того места куда надо поместить.
                                var text          = $(this).html();  
                                var text_width_px = ( params.parent==false ) ? $(this).width(): $(params.parent).width();
                                
                                //Сохраняем объект что б не обрабатывать его повторно. или так $(this).parent().css('display')!='none'
                                if(jQuery.inArray( this, Extends_KSE_StringSplit_This )==-1 && text_width_px !=0)
                                    {
                                        Extends_KSE_StringSplit_This[Extends_KSE_StringSplit_count] = this;
                                        Extends_KSE_StringSplit_count++;
                                    }
                                else return true;
                                
                                var tags      = "<.+?>";          //Паттерн поиска тегов; 
                                var tags_w    = /<\.+?>/g;        //Паттерн поиска тегов для проверки методом test;
                                var nbsp      = "&nbsp;|\\s+";    //Паттерн поиска пробелов;
                                var nbsp_w    = /&nbsp;|\s+/g;    //Паттерн поиска пробелов для проверки методом test;
                                var temp      = '';
                                var test_span = 'test_span';      //Тестовый span.Включается в поток для посчёта занимаемого места буквой в пикселях.Среднее значение.Для самой большой буквы;
                                
                                //Окончание                                
                                var end    = '';
                                
                                //Собираем окончание.
                                for(var i=0;i<params.count;i++)
                                    end+=params.point;
                                
                                //Определяем язык.
                                var letter     = ( params.language.toString().indexOf('ru') !=-1 ? 'Ш':'F' );
                                var letter_min = ( params.language.toString().indexOf('ru') !=-1 ? 'ш':'s' );

                                                                                                
                                //Добавляем тестовый span в поток
                                $('body').append('<span style="position:absolute" id="'+test_span+'"></span>');
                                
                                
                                //Определяем ширину тестовой буквы.
                                var id                  = '#'+test_span;
                                var letter_width_px     = $(id).html(letter).width(); 
                                var letter_min_width_px = $(id).html(letter_min).width();
                               
                                //Засовываем туда текст который надо обработать.Определяем его истинную ширину.
                                var original_text_width_px   = $(id).html(text).width();      
                                                                
                                //Удаляем тестовый span
                                $(id).remove().empty(); 
                                
                                //Определяем макс.колличество букв которые войдут в заданную ширину
                                var max = (text_width_px*params.number/letter_width_px)-params.count;
                                
                                if( original_text_width_px>(text_width_px*params.number) && text_width_px != 0 )
                                    {
                                        
                                      MyObject = {
                                                OBJECT              : Extends_KSE_StringSplit_k,
                                                count_letter        : 0,
                                                test_letter_width   : letter_width_px,
                                                test_letter_width_min : letter_min_width_px,
                                                test_letter         : letter,
                                                max_width           : max,
                                                original_text_width : original_text_width_px,
                                                text_width          : text_width_px,
                                                finishing           : end,
                                                original_text       : text,                                       
                                                string              : ''
                                            };
                                            
                                        var word  = Split(text,tags);
            
                                        one:
                                        for( var i=0;i<word.length;i++)
                                            {   
                                                var tr  = 0;
                                                var ntr = '';
                                                temp    = '';                
                    
                                                if(word[i]!=false)
                                                    {                                                        
                                                        if(i%2==false)//Четные элементы
                                                            {                                     
                                                                if(MyObject.count_letter+word[i].length > max && nbsp_w.test(word[i])==null) 
                                                                    {
                                                                        MyObject.string+=end;
                                                                        break one;
                                                                    }
                                                                else
                                                                    {   
                                                                        if( nbsp_w.exec(word[i])!=null)
                                                                            {                                          
                                                                                var arr = Split(word[i],nbsp);                                                   
                                                
                                                                                two:
                                                                                for( var j=0;j<arr.length;j++)
                                                                                    {   
                                                                                        if(arr[j]!=false)
                                                                                        {  
                                                                                            if( arr[j]=='&nbsp;') 
                                                                                                {   
                                                                                                    if(params.flag_nbsp)
                                                                                                        {
                                                                                                            MyObject.count_letter++;
                                                                                                            tr++;
                                                                                                            ntr+=arr[j];
                                                                                                        }
                                                                                                    else continue;    
                                                                                                }     
                                                                                             else
                                                                                                {   
                                                                                                    if( (MyObject.count_letter+arr[j].length+tr+1)>max ) 
                                                                                                        {
                                                                                                            MyObject.count_letter=MyObject.count_letter-tr;
                                                                                                            MyObject.string+=temp+end; 
                                                                                                            break one;
                                                                                                        }
                                                                        
                                                                                                     MyObject.count_letter+= arr[j].length+1;
                                                                                                     temp+=ntr+arr[j]+' ';
                                                                                                     tr  = 0;
                                                                                                     ntr = '';                                                                         
                                                                                                }                                   
                                                                                        }    
                                                                                    }                                                    
                                                                                MyObject.string+=temp;                                                   
                                                                                if(MyObject.count_letter>max) 
                                                                                    {                                                               
                                                                                        MyObject.string+=end;
                                                                                        break one;
                                                                                    }                                                    
                                                                            }
                                                                        else
                                                                            {                                                         
                                                                                MyObject.string+=word[i];  
                                                                                MyObject.count_letter+= word[i].length+1;                                                    
                                                                            }
                                                                    }                                                              
                                                            }
                                                        else          //НеЧетные элементы
                                                            {
                                                                if( tags_w.test(word[i])!=null && params.flag_tags ) MyObject.string+=word[i];
                                                                else MyObject.string+=' ';
                                                            }                                
                                                    }                                                
                                            }                
                                        $(this).html(MyObject.string);
                                           
                                        //Сохраняем в массиве
                                        Extends_KSE_StringSplit_AllObj[Extends_KSE_StringSplit_k] = MyObject;
                                        Extends_KSE_StringSplit_k++;  
                                                                                                                                                            
                                        delete MyOject;                                            
                                    }
                            }                        
                    );
                
                if(params.debug) 
                    {    
                        var allText    = Debug(Extends_KSE_StringSplit_AllObj);
                        var windowText = '<h4 align="center"> Нет данных </h4>';
                        
                        if(params.debug == 1) //Если отладка с помощью окна                          
                            {   
                                
                                if(!$('#window').length)
                                    {                                    
                                            $('body').append(div);
                                            modal();
                                    }

                                //Обработчик перемещения и изменения размеров отладочного окошка.
                                //Для корректой работы требуется файлы popup.css с папкой images( картинки ),interface.js и iresizable.js    

                                $('#window').Resizable(
                                                            {
                                                                minWidth: 400,
                                                                minHeight: 100,
                                                                maxWidth: 700,
                                                                maxHeight: 400,
                                                                dragHandle: "#window",
                                                                handlers: {
                                                                se: '#windowResize'
                                                                },
                                                                onResize : function(size, position) 
                                                                    {
                                                                        $('#windowBottom, #windowBottomContent').css('height', size.height-33 + 'px');
                                                                        var windowContentEl = $('#windowContent').css('width', size.width - 25 + 'px');
                                                                        if (!document.getElementById('window').isMinimized) 
                                                                            {
                                                                                windowContentEl.css('height', size.height - 48 + 'px');
                                                                            }
                                                                    }
                                                            }
                                                        ); 
                                if(allText.allHTML)  windowText = allText.allHTML;
                                $('div#windowContent').html(windowText);                                                                                    
                            }
                        else //Если отладка с помощью алерта
                            {
                                alert(allText.allAlert);
                            }
                        delete allText;                        
                    }
                return;
            }; 
            
        //Открывает окошко            
        function modal()
            {    
                if($('#window').css('display') == 'none') $('#window').slideDown(400)        
                return true;
            }
                           
        //Вспомогательная функция.Разбивает переданную строку на заданый паттерн.    
        function Split(string,regexp)
            {
                var re  = new RegExp(regexp,"g")
                var out = new Array(),j=0,st=0,arr;
        
                while((arr=re.exec(string))!=null)
                {
                    out[j++] = string.substr(st,arr.index-st);
                    st       = re.lastIndex;        
                    out[j++] = arr;       
                }
                out[j]=string.substr(st);
                return out;
            };
            
        //Функция отладки
        function Debug(Obj)
            {
                var all = Array();
                all.allAlert = all.allHTML = '';
                for (var i=0;i<Obj.length;i++)
                {
                    for (var key in Obj[i]) 
                            {
                                var cod_o   = '';    
                                var cod_c   = '';    
                                var teg_o   = '<font color="red">';    
                                var teg_c   = '</font>';    
                                var value   = Obj[i][key];
                                var value_t = '';
                                
                                all.allAlert += key+' - '+Obj[i][key]+"\r\n\n";
                                if(key=='original_text'|| key=='string') 
                                    {
                                        cod_o = "<xmp>";
                                        cod_c = "</xmp>";
                                    }
                                if(key=='OBJECT') 
                                    {
                                        teg_o   = "<h4 align='center'>";
                                        teg_c   = "</h4>";
                                        value_t = value;
                                        value   = '';
                                    }
                                                                       
                                all.allHTML  += teg_o + key + " - " + value_t + teg_c + cod_o + value + cod_c + '<br>';                                                            
                            }
                    all.allAlert +="\r\n\n";
                    all.allHTML +='';        
                }                                
                return all;
            };        
    }
)(jQuery);
