/*!
 * jQuery-dialog
 * Опции:
 * - width: ширина диалога
 * - height: высота диалога
 * - header: заголовок (опционально)
 * Методы:
 * - open: открывает диалог
 * - close: закрывает диалог
 * - showLoader: показать загрузчик
 * - hideLoader: скрыть загрузчик
 * - animateSize: динамическое изменение размеров
 */


jQuery.fn.shadowdialog = function (options) {

    var isDialog = $(this).attr('isDialog');

    if(isDialog != "true")
        prepareDialog(this,options);
    else {
        
        if(options == 'open')
            openDialog(this);
        else if (options == 'close')
            closeDialog(this);
        else if (options == 'showLoader') {
            $(".dialog-loader",this).fadeIn('slow');
        }
        else if (options == 'hideLoader')
            $(".dialog-loader",this).hide();
        else if(options == "animateSize") {
            var animOptions = arguments[1];
            ShadowDialogAnimateSize(this,animOptions.width,animOptions.height,animOptions.duration, animOptions.callback);
           
        }

        if(options.header != null)
            ShadowDialogSetTitle(this,options.header);
        if(options.height != null) 
            ShadowDialogSetHeight(this,options.height);
        if(options.width != null)
            ShadowDialogSetWidth(this,options.width);

        ShadowDialogBindEvents(this,options);
    }   
}

function prepareDialog(target,options){
    var width = options.width;
    var height = options.height;

    var clientWidth = document.getElementsByTagName("html")[0].clientWidth;
    var clientHeight = document.getElementsByTagName("html")[0].clientHeight;
    var scroll = document.getElementsByTagName("html")[0].scrollTop;
   
    var left = clientWidth / 2 - width / 2;
    var top = scroll+clientHeight / 2 - height / 2;

    var title = $(target).attr('header');

    var outher = $("<div/>");

    //создадим фон
    var background = $("<div/>")
                     .addClass('dialog-background')
                     .css('width',"100%")
                     .css('height',"100%")
                     .css('position','absolute')
                     .css('left','0px')
                     .css('top','0px')
                     .css('z-index','100');
    $(outher).append(background);

    //создадим тень
    var shadow = $("<div/>")
                 .addClass("dialog-shadow dialog-corner-all")
                 .css('width',(width+2)+"px")
                 .css('height',(height+2)+"px")
                 .css('position','absolute')
                 .css('left',left+'px')
                 .css('top',top+'px')
                 .css('opacity','0.40')
                 .css('z-index','100');
    $(outher).append(shadow);

    //создадим панель картинки с загрузкой
    var loader = $("<div/>")
                 .addClass("dialog-loader")
                 .css('left',(clientWidth / 2 - 16)+'px')
                 .css('top', (clientHeight / 2 - 16)+'px')
                 .css("z-index","1105")
                 .hide();
    $(outher).append(loader);

    //создаем панель диалога
    var panel = $("<div/>")
                .addClass("dialog-corner-all dialog-content")
                .css('width',width+"px")
                .css('height',height+"px")
                .css('position','absolute')
                .css('left',left+'px')
                .css('top',top+'px')
                .css('z-index','100');

    //создадим тело диалога
    var body = $("<table style='width:100%;height:100%;' cellpadding='0' cellspacing='0'>"+
                      //заголовок
                      "<tr class='dialog-header-panel' style='height:30px'>"+
                          "<td style='padding-left: 5px;padding-right: 5px;height:30px;'>"+
                             "<span style='float:left'>"+title+ "</span>"+
                             "<div class='dialog-header-close' style='float:right'/>"+
                          "</td>"+
                      "</tr>"+
                      //тело
                      "<tr class='dialog-body-tr'>"+
                          "<td style='vertical-align: top; padding: 10px;'>"+
                              "<div class='dialog-body-panel' >"+$(target).html()+"</div>"+
                          "</td>"+
                      "</tr>"+
                      //нижний колонтитул
                      "<tr style='height:50px;'>"+
                          "<td style='height:50px;'>"+
                                 "<div id='hr1'/>"+
                                 "<table width='100%'>"+
                                    "<tr>"+
                                        "<td style='text-align: left'>"+
                                            "<input type='button' class='dialog-footer-prev' value='Назад'/>"+
                                        "</td>"+
                                        "<td style='text-align: right;vertical-align:middle;'>"+
                                            "<input type='button' class='dialog-footer-close' value='Закрыть'/>"+
                                        "</td>"+
                                    "</tr>"+
                                "</table>"+
                          "</td>"+
                      "</tr>"+
                 "</table>");
    $(panel).append(body);
    
    $(outher).append(panel);
    

    $(target).html($(outher).html());
    $(target).attr('isDialog','true');
    $('.dialog-footer-prev',target).hide();
    $(target).hide();
    $(".dialog-header-panel > td",target).disableTextSelect();

    ShadowDialogBindEvents(target,options);
    ShadowDialogDefineEvents(target);

    //сохраняем опции
    $(target).data('options',options);
}

function openDialog(target) {

   relocateDialog(target);
    $(target).trigger("dialogopen");
    relocateDialog(target);
    $(target).show();
}

function closeDialog(target) {
    $(target).hide();
}

function relocateDialog(target){
    var width = $(target).data('options').width;
    var height = $(target).data('options').height;

    var scroller = "html";
    //хак для Chrome и Safari
    if($.browser.chrome || $.browser.safari) {
        scroller = "body";
    }
    var scroll = document.getElementsByTagName(scroller)[0].scrollTop;


    var allHight = $("body").height();
    var allWidth = $("body").width();
   
    var visibleWidth = $("html").width();
    var visibleHeight =  $("html")[0].clientHeight;

    if(visibleHeight > allHight)
        allHight = visibleHeight


    var top = scroll+visibleHeight / 2 - height / 2;
    var left = visibleWidth / 2 - width / 2;

    $(".dialog-background",target)
        .css('height',allHight)
        .css('width',allWidth);
    $(".dialog-shadow",target)
        .css('top',(top-5)+'px')
        .css('width',(width+10)+"px")
        .css('height',(height+10)+"px")
        .css('left',(left-5)+'px');
    $(".dialog-content",target)
        .css('width',width+"px")
        .css('height',height+"px")
        .css('left',left+'px')
        .css('top',top+'px');
    $(".dialog-loader",target)
        .css('left',(visibleWidth / 2 - 16)+'px')
        .css('top', scroll+ (visibleHeight / 2 - 16)+'px');

    var bheight = height;
    var theight = height;
    //хак для IE6,IE7
    if($.browser.msie ) {
        var version = $.browser.version.toString().substr(0, 1);
        if(version == "6" || version == "7") {
           
            theight = theight-25;
            bheight = bheight -5;
        }
    }
    $(".dialog-body-tr", target)
        .css('height',(theight-30-50)+"px");
    $(".dialog-body-panel", target)
        .css('height',(bheight-30-50-10-10-5)+"px");
}

function ShadowDialogSetTitle(target,title) {
    $(".dialog-header-panel > td > span",target).text(title);
}

function ShadowDialogSetHeight(target,height) {
    $(target).data('options').height = height;
    relocateDialog(target);
}

function ShadowDialogAnimateSize(target,width,height,duration,callback) {
     var w1 = $(target).data('options').width;
     var w2 = width;
     var h1 = $(target).data('options').height;
     var h2 = height;

     var a = new Date();
     var t1 = a.getHours() * 3600000 + a.getMinutes() * 60000 +
                       a.getSeconds()*1000 + a.getMilliseconds();

     setTimeout(function(){

         var a = new Date();
         var t = a.getHours() * 3600000 + a.getMinutes() * 60000 +
                                     a.getSeconds()*1000 + a.getMilliseconds();
         var elapsed = t - t1;
         if(elapsed < duration) {
             var w = (elapsed - duration)*(w2 - w1)/duration + w2;
             var h = (elapsed - duration)*(h2 - h1)/duration + h2;
             ShadowDialogSetSize(target,w,h);
         }
         else {
             ShadowDialogSetSize(target,width,height);
             callback();
         }

         if(elapsed < duration)
            setTimeout(arguments.callee, 20);

     }, 20);
}

function ShadowDialogSetWidth(target,width) {
    $(target).data('options').width = width;
    relocateDialog(target);
}

function ShadowDialogSetSize(target,width,height) {
    $(target).data('options').width = width;
    $(target).data('options').height = height;
    relocateDialog(target);
}

//байндит пользовательскую обрабоку событий:
//dialogopen - открытие диалога
//dialogprev - нажатие на кнопку "Назад"
function ShadowDialogBindEvents(target,options) {

    //сбандим обработку события открытия диалога
    if(options.onOpen != null){
        $(target).unbind('dialogopen');
        $(target).bind('dialogopen',options.onOpen);
    }

    //сбандим обработку события нажатия "Назад"
    if(options.onPrev != null) {
        $(target).unbind('dialogprev');
        $(target).bind('dialogprev',options.onPrev);
    }
}

//определяет обработку системных событий
function ShadowDialogDefineEvents(target){
    //при нажатии на x закрываем диалог
    $(".dialog-header-close",target).click(function(){
        closeDialog(target);
    })

    //нажатие на кнопке "Закрыть"
    $(".dialog-footer-close",target).click(function(){
        closeDialog(target);
    })

    //нажатие на кнопке "Назад"
    $(".dialog-footer-prev",target).click(function(){
         $(target).trigger("dialogprev");
    });

    $(".dialog-footer-close,.dialog-footer-prev").each(function(){
        var fontSize = $(this).css('font-size');
        fontSize= parseInt(fontSize.replace("px", ""));
        $(this).mouseenter(function(){
            $(this).css("font-size",(fontSize+1)+"px");
        })
         $(this).mouseout(function(){
            $(this).css("font-size",(fontSize)+"px");
        })
    });

    $(".dialog-background",target).click(function(){
        return false;
    })

}
