/////  ХХХ - это что-то нужно е для работы флешки... нужны бы поразбираться...

/**
 * @author maxmednikov
 */


var _counter = 0;

function initMenu(domChunk) {
    $(domChunk).each(function(i) {
     //   $(this).prepend("<div class='menuOverlay' />");
     //   $(this).find('.menuOverlay').css("width", this.offsetWidth + "px");
    }
    );

    $(".headerLink").mouseover(
        function() 
        {
            $(this).addClass("headerLinkOver");
        }
        );

    $(".headerLink").mouseout(
        function() {
            $(this).removeClass("headerLinkOver");
        }
        );

    $(domChunk).mouseover(
        function() {
            $(this).find(".subMenu").fadeIn();
            //$(this).find(".subMenu").show('fast');
        });

    $(domChunk).mouseleave(
        function() {
               $(this).find(".subMenu").fadeOut();
            //$(this).find(".subMenu").hide('fast');
        });
}
 
 
function Command(name) 
{    
    this.parameters = new Array();
    this.name = name;
    this.addParam("command",name);    
    this.httpPath = "command.aspx";                
}

Command.prototype.execute = function() {
$.ajax({
        timeout:180000,
        type: "POST",
        parent: this,
        dataType: "json",
        url: this.httpPath,
        data: this.createParameters(),
        success: function(data) {

            $(this.parent).trigger("command:success", data);

        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            var status = XMLHttpRequest.getResponseHeader("Status");
         //debugger;
            $(this.parent).trigger("command:error", status, this.parent.data);

        },

        processData: false
    });

    return 0;
}
      
Command.prototype.createParameters = function()
{
    var result = "";
    for(var i=0; i<this.parameters.length; i++)
    {
        var param = this.parameters[i];
        result += param.name;
        result += "=";
        result+= param.value;
        if(i<this.parameters.length-1)
        {
            result+="&";
        }
    }
    return result;
}
      
     
      
Command.prototype.addParam = function(name,value)
  {
    var par = new Parameter(name,value);
    this.parameters.push(par);
  }


  function executeCommand(name,params) {
      
     $.ajax({
        timeout:180000,
        type: "POST",     
        dataType: "json",
        url: name,
        data: params,
        processDate:false
        
        });
  }

function Parameter(name, value) 
{
    this.name = name;
    this.value = value;    
}

function UpdateParameter(objectId,name, value,element,resultCallback) 
{
    this.objectId = objectId;
    this.name = name;
    this.value = value;    
    this.element = element;
    this.resultCallback = resultCallback;
}

function test()
{
    var cmd = new Command("test");
    cmd.parameters.push(cmd);
    cmd.execute();
    
}


$(document).ready(function() {

    

    $.ajaxSetup({ timeout: 180000 });

    _updateCommand = new UpdateObjectCommand();
    //_updateCommand.
    //IE doesn't support Array.indexOf function!!!
    setupJScriptArray();

    //saves objects changes into database;
    //setTimeout(executeSave,1000);

    //initMenu("a.menuItem, div.menuItem,div.menuItem");
    $("#bToggleChat").click(
                function() { toggleChat(this); }
            );


});
 
 
 function executeSave()
 {
      _updateCommand.save(); 
  }
 
 function setupJScriptArray()
 {
    if(Array.indexOf) return;
    Array.prototype.indexOf = function(obj, start)
    {
        for(var i=(start||0); i<this.length; i++)
        {
            if(this[i]==obj)
            {
                return i;
            }
        }
    }
 }

//************************************************************************//
var _updateCommand;

function changeObject(objectId,name,value,parentElement,resultCallback)
{
    _updateCommand.changeObject(objectId,name,value,parentElement,resultCallback);
}

function commitChanges() 
{  
    _updateCommand.save();    
}

function UpdateObjectCommand()
{
    this.propertiesArray = new Array();
}

UpdateObjectCommand.prototype.changeObject = function(objectId,name,value,parentElement,resultCallback)
{
   var par = this.findParameter(objectId,name);
   
   if(par==null)
   {
        par = new UpdateParameter(objectId,name,value,null,resultCallback);
        this.propertiesArray.push(par);
   }
   par.value = value;
   if(parentElement!=null)
   {
        $(parentElement).addClass("changeStart");
        par.element = parentElement;
   }
}

UpdateObjectCommand.prototype.findParameter = function(objectId,name)
{
    for(var i=0;i<this.propertiesArray.length;i++)
    {
        var param = this.propertiesArray[i];
        if(param.objectId==objectId && param.name == name )
        {
            return param;
        }
    }
    return null;
}
UpdateObjectCommand.prototype.copyParameters = function(params)
{
    var result = new Array();
    for(var i=0;i<params.length;i++)
    {
        var param = params[i];
        
        var newParam = new UpdateParameter();
        newParam.objectId = param.objectId;
        newParam.name = param.name;
        newParam.value = param.value;    
        newParam.element = param.element;
        newParam.resultCallback = param.resultCallback;
        result.push(newParam);
    }
    return result;
}


UpdateObjectCommand.prototype.changesExists = function()
{
    return this.propertiesArray.length!=0;
}

UpdateObjectCommand.prototype.save = function() {

    if (!_updateCommand.changesExists()) return;

    var cmd = new Command("UpdateObjectCommand");

    for (var i = 0; i < this.propertiesArray.length; i++) {
        var param = this.propertiesArray[i];
        var key = param.objectId + ":" + param.name;
        cmd.addParam(key, param.value);
    }

    $(cmd).bind("command:success", this.clearChanged);
    $(cmd).bind("command:error", this.onerror);

    cmd.changedProperties = this.copyParameters(this.propertiesArray);
    cmd.execute();
    this.command = cmd;

}



UpdateObjectCommand.prototype.onerror = function(sender, error, data) {

    if (error == "") error = "Error occuired during the update.";
    showWarning(error);
    clearChanged(sender, data);
}

UpdateObjectCommand.prototype.clearChanged = function(sender, data)
{
    for(var i=0;i<this.changedProperties.length;i++)
    {
       var param = this.changedProperties[i];
       var globParam = _updateCommand.findParameter(param.objectId,param.name);
       var ind = _updateCommand.propertiesArray.indexOf(globParam);
       if(globParam!=null && globParam.value == param.value)
       {
           if(param.element!=null)
           {
                $(param.element).removeClass("changeStart");
           }
           if(param.resultCallback != null)
           {
               param.resultCallback(param,data);
           }
           _updateCommand.propertiesArray.splice(ind,1);
       }
    }
}



function loadControl(controlUrl, target) {
    $.ajax({        
        url: controlUrl,
        cache: false,
        success: function(html) {
            $("#" + target).html(html);
        }
    });
}




function cancelBuble(e) {
    if (!e) e = window.event;
    if(e) e.cancelBubble = true;
}

function loadPage(controlUrl, linksUrl,e) {
    cancelBuble(e);    
    
    $.ajax({
        url: controlUrl,
        cache: false,
        data:"__ispage=1",
        success: function(html) {
                if(linksUrl != null)
                {
                    loadLinks(linksUrl);                
                }
                $("#mainPlaceHolder").html(html);
            }
            

        
    });

}


function loadLinks(linkUrl)
{
    loadControl(linkUrl, "rightPlaceHolder");    
}


/*
function showWarning(text) {

    $(".warningDialog.text").html(text);
    $("#warningDialog").dialog('open');
}
*/
function showWarning(text,title) {

    $(".warningDialog.text").html(text);
    $("#warningDialog").dialog('open');
    if (title != null && title != undefined) {
        $('#warningDialog').dialog('option', 'title', title);
    }
}



var ii;
function showDialog(url,title, dlgWidth, dlgHeight) {
    var dlgid = "dlg" + _counter++;
    $('<div id="' + dlgid + '" ></div>').prependTo("body");
    $.ajax({
        url: url,
        cache: false,
        success: function(html) {
         
            ii = "#" + dlgid;

            $(ii).html(html);
            $(ii).dialog({ position: 'center', width: dlgWidth, height: dlgHeight });
            $(ii).dialog('open');



        }
    });

}




function onDialogLoaded() {
}

/* defult parameters for grid edit */

var defEditPrm = {
    width: 450,
    top: 155,
    left: 150,
    reloadAfterSubmit: true,
    closeAfterAdd: true, closeAfterEdit: true
};


/* search box */

jQuery.fn.searchBox = function(params) {
    return this.each(function() { initSearchBox(this, params) });
};


function initSearchBox(elem, params) {
    $(elem).keyup(
        function(event) {
            if (event.keyCode == 27) {
                $(elem).attr("ObjectId",0);
                $(".searchBoxTable").replaceWith("");
                return;
            }

            if (event.keyCode == 13) {
                searchBoxSetResult($('#' + $(this).attr('id') + 'Table'));
                $(".searchBoxTable").replaceWith("");
                return;
            }
            sendSearchBoxRequest(this);
        }
    );  
}

function sendSearchBoxRequest(elem) {

    $(elem).removeClass('searchBoxInputFilled').addClass('searchBoxInputSearching');
    if ($(elem).val().length == 0) {
        $(elem).removeClass('searchBoxInputFilled').removeClass('searchBoxInputSearching');
        $(elem).attr("ObjectId",0);
        return;
    }
    var data = "";
    data += "datasource="+$(elem).attr("datasource") + "&";
    data += "display="+$(elem).attr("display") + "&";
    data += "search="+$(elem).attr("search") + "&";
    data += "val="+$(elem).val();

    $.ajax({
        url: "SearchBoxCommand.cmd",
        data: data,
        cache: false,
        dataType: "json",
        success: function(res) 
        {
            showSearchResults(elem,res);                        
        }
    });
}

function showSearchResults(elem, res) {
    var id = $(elem).attr('id');
    var a = new String();

    var cols = $(elem).attr("display").split(',');
    var elemOffset = $(elem).offsetParent();
    var resHTML = '<table inputId="'+id+'" id="'+(id+'Table')+'" onkeyup="searchBoxKeyUp(event)" onclick="searchBoxClick(event)" onmouseover="searchBoxMouseOver(event)" class="searchBoxTable" style="position:absolute;background-color:whitesmoke;z-index:2;left:' + $(elem).offset().left + 'px;top:' + (elemOffset.top + $(elem).height()) + 'px">';


    for (var i = 0; i < res.lines.length; i++) {
        resHTML += "<tr>";
        var classStr = i == 0 ? ' class=searchBoxSelected ' : ''; 
                
        for (var j = 0; j < cols.length; j++) {

            resHTML += '<td ObjectId="' + res.lines[i]["ObjectId"] + '" ' + classStr + '>' + res.lines[i][cols[j]] + '</td>';
        }
        resHTML += "</tr>";
    }

    resHTML += "</table>";

    
    //alert(resHTML);
    $(".searchBoxTable").replaceWith("");
    $(elem).after(resHTML);
}

function searchBoxKeyUp(e) {
}

function searchBoxClick(e) {

    searchBoxSetResult($(e.srcElement).parents('table'));
}

function searchBoxSetResult(table) {

    if (table == null) return;
    var inputId = $(table).attr('inputId');
    var text = "";
    $(table).find('td[class=searchBoxSelected]').each(function() { text += ($(this).text() + "  "); });

    $("#" + inputId).attr("ObjectId", $(table).find('td[class=searchBoxSelected]').attr('ObjectId'));
    $("#" + inputId).val(text);

    $("#" + inputId).removeClass('searchBoxInputSearching').addClass('searchBoxInputFilled');

    $(".searchBoxTable").replaceWith("");
}

function searchBoxMouseOver(e) {

    var td = e.srcElement;
    if ($(td).hasClass('searchBoxSelected')) return;
    var ttt = ($(td).closest('table').find('td').length);
    
    $(td).parents('table').find('td').removeClass('searchBoxSelected');

    $(td).parent().children('td').addClass('searchBoxSelected');   
    //$(td.parentNode).children('td').addClass('searchBoxSelected');
}



/******** Date Range Filter **************************/

jQuery.fn.dateRangeSearch = function(params) {
    return this.each(function() { initDateRange(this, params) });
};

function initDateRange(elem, params) {

    var now = new Date();
    var prev = new Date();
    
    prev.setDate(now.getDate() - 5);
    
    $(elem).DatePicker({
        flat: false,
        format: 'd.m.Y',
        date: [prev, now],
        current: now,
        calendars: 1,
        mode: 'range',
        starts: 1,
        onChange: function(formated, dates) {
            formated = String(formated).replace(",", " - ");
            $(elem).val(formated);
            
        },
        onHide: function()
        { 
           filterDateRange($(elem),jQuery(params.grid), params.urlFunction);
        }
    });
    
    var dateStr = String($(elem).DatePickerGetDate(true)).replace(",", " - ");
    $(elem).val(dateStr);
    
    
}
function filterDateRange(datePicker, grid, urlFunction)
{
    var addToUrl = urlFunction();
    var currUrl = jQuery(grid).getGridParam("url");
    currUrl += addToUrl;
    /*
    var dates = $(datePicker).DatePickerGetDate(false);
    
    currUrl+="__dateFrom=" + dateToString( dates[0] )+"&__dateTo="+dateToString( dates[1] );
    currUrl +="&__dateRangeFilterBy="+filterBy;
    currUrl+="&_search=true";
    */


    jQuery(grid).setGridParam({ url: addToUrl });
    jQuery(grid).trigger("reloadGrid");
    
    //jQuery(grid).setGridParam( {url:oldUrl } );
    
}

function dateToString(date)
{
    var result = "";
    if (date == null) return "";
    result = date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
    return result;
}

function getFlexApp(appName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[appName];
    } else {
        return document[appName];
    }
}


function loadFlash(authCode, flashName, url, eventId, hallId, priceListId, loadCompleteCallback) {
//  alert(eventId);
    var flash = getFlexApp(flashName);
    
    if (flash == undefined || flash.setUrl == undefined) {
        setTimeout(
            function() { loadFlash(authCode, flashName, url, eventId, hallId, priceListId, loadCompleteCallback); }, 200
            );
    }
    else {
        flash.setUrl(url);
        if (flash.setUrlSwf != undefined) {
            flash.setUrlSwf(url + "swf/");
        }        

        if (authCode != null && authCode != undefined) {
            flash.setSession(authCode);
        }
        
        
        if (eventId != null && eventId != undefined) {
            flash.setEvent(eventId);
        }
        
        
        if (hallId != null && hallId != undefined) {
            flash.setHall(hallId);
        }
        
        if (priceListId != null && priceListId != undefined) {
            flash.setPriceList(priceListId);
        }
        
        if (loadCompleteCallback != undefined && loadCompleteCallback != null) {
            loadCompleteCallback(flash);
        }
        
    }

}
function openNewPage(control, params) {
    params = params.replace("=", ",");
    window.open("loadnewpage.aspx?control=" + control + "&param=" + params, "_blank");
}

function extendGridSearch(gridId) {
    
    var decr = 0;
    if ($.browser.mozilla) {
        decr = 13;
    }
    if ($.browser.safari) {
        decr = 18;
    }
    if ($.browser.msie) {
        decr = 12;
    }
    
    $(gridId).find(".filtertable :input").addClass("searchInput").each(function() {
        if ($(this).attr("type") == "text") {
            $(this).width($(this).width() - decr);
        }
    });
}
