﻿/// <reference path="jquery.js"/>






function ShowError(e, callback) {
    if (callback == undefined)
        infoPanel.CreateError('Error Details<br> Code: <b>' + e.Code + '</b>.<br>Message: <b>' + e.ErrorMessage + '</b>','Error on Page');
    else
        callback(e);
}
function UpdateNulls(data) {
    return data;
}
/***************************
***  jForm  - edit forms processing
***************************/

function jForm(containerID, requestKey) {
    var jF = this;
    jF.containerID = 'form'; 
    jF.requestKey = 'object';

    jF.Files = [];
    jF.FormObject = {};
    jF.FormObjectValues = Array();
    jF.Load = function() {
        var jinput;
        var inputs = $("#" + jF.containerID + " input");
        for (var i = 0, f = 0; i < inputs.length; i++) {
            input = $(inputs[i]);
            //alert(input.val());
            if (input.attr("type") == "text" || input.attr("type") == "hidden") {
                jF.AddField(input.attr("name"), input.val(), input.attr("valueType"));
            }
            else if (input.attr("type") == "checkbox") {
                var inputVal = input.attr("checked") == "checked" ? 1 : 0;
                jF.AddField(input.attr("name"), inputVal);
            }
            else if (input.attr("type") == "file") {
                jF.Files[f] = { id: input.attr("id"), name: input.attr("name"), value: input.val()};
                f++;
            }
        }
        var selectOptions = $('#' + jF.containerID + ' select option:selected');

        for (i = 0; i < selectOptions.length; i++) {
            option = $(selectOptions[i]);
            parentSelect = option.parent();
            jF.AddField(parentSelect.attr('name'), option.val(), option.parent().attr("valueType"));
        }
        var textareas = $('#' + jF.containerID + ' textarea');

        for (i = 0; i < textareas.length; i++) {
            var textarea = $(textareas[i]);
            //alert(textarea.val());
            jF.AddField(textarea.attr('name'), textarea.val());

        }
        return jF;

    };

    jF.AddField = function(name, value, valueType) {
        var typedValue = value;
        if (valueType != undefined) {
            if (valueType == "int") {
                typedValue = parseInt(value);
            }
            else if (valueType == "decimal" || valueType == "float") {
                typedValue = parseFloat(value);
            }
        }

        jF.FormObject[name] = typedValue;
    };
    jF.Eval = function() {
        return jF.FormObject;
    };
    jF.toString = function() {
        //alert(jF.ObjectJson);
        //return $.param(jF.FormObject);
        return JSON.stringify(jF.FormObject);
    };
    jF.UploadFiles = function(handler, params, callback, errorCallback) {
        if (jF.Files.length > 0) {
            for (var i = 0; i < jF.Files.length; i++) {
                var file = jF.Files[i];
                if (file.value != '') {

                    UploadFile(handler, params, file.id, function(data) {
                        if (jF.FormObject != undefined && ResponseOk(data) && !WasErrors(data)) {
                            callback(data);
                        }
                        else { errorCallback(data); }

                    });
                }
            }
        }

    };

   
    if (containerID != undefined) {
        jF.containerID = containerID;
        jF.Load();
    }
    else { throw "Exception: Pager options ID isn't set."; }
}



/***************************
***  Grid helper functions
***************************/

function UpdateRecordFieldEx(handler, params, callback) {


    GetJson(handler, params, function(data) {
        if (ResponseOk(data) && !WasErrors(data) && data.results == true) {
            if (callback != undefined) callback(data);
            return true;
        } else if (ResponseOk(data) && WasErrors(data)) {
            infoPanel.CreateError('Error Details<br> Code: ' + data.error.Code + '.<br>Message: ' + data.error.errorMessage, 'Error on Page');
        } else {
            infoPanel.CreateError('Db Record update fails', 'Error on Page');
        }

    });
}
function UpdateRecordField(handler, method, tbx, callback) {
    var field = tbx.attr('name');
    var newValue = tbx.val();
    if (newValue == tbx.attr("oldValue")) return true;
    
    var params = {
        action: method,
        Id: JSON.stringify(activeRow.attr('rowId')),
        field: field,
        value: newValue
    };

    UpdateRecordFieldEx(handler, params, callback);

}

function BeginEditRecordField() {

    $(this).attr("oldValue", $(this).val());
    //alert(savedOldValue);
    activeRow = $(this).parent().parent();
    //alert(activeRow.attr("pid"));
}

/***************************
***  Grid filters processing
***************************/

function jFilterItem() {
    this.Field = "";
    this.SecondField = "";
    this.Value = "";
    this.Type = 0;
    this.Mode = 1;
}

function jFilter(filterId) {
    var jF = this;
    jF.filterId = ''; 
    jF.UrlHash = ''; 
    jF.Items = Array();


    jF._fromUrl = function()
    {
//        var url = window.location.hash;
//        var pPart = jH.getUrlPart(url, 'p=');
//        var page = 1;
//        
//        if (pPart != '') {
//            page = parseInt(pPart.substring(2));
//        }
//        
//        jP.SetPage(page);
    }

    jF._toUrl = function()
    {
//        var url = window.location.hash;
//        var fPart = jH.getUrlPart(url, 'f=[');
//        if (fPart == '') {
//            if (url == '') url = 'f=[' + jF.UrlHash + ']';
//            else url = url + '/f=[' + jF.UrlHash + ']';
//        } else {
//            url = url.replace(fPart, 'f=[' + jF.UrlHash + ']');
//        }
//        window.location.hash = url;
    
    }
    jF.Load = function() {
        jF._load();
        return jF;
    }
    jF._load = function() {
        var formFields = $("#" + jF.filterId + " input");
        jF.Items = new Array();

        var item, formField;

        var formFieldsInput = $('#' + jF.filterId + '  input[jFilter=1]');
        for (var i = 0; i < formFieldsInput.length; i++) {
            formField = formFieldsInput.get(i);
            jFormField = $(formField);
            if (jFormField.attr("type") == "text") {
                if (formField.value != '') {
                    item = new jFilterItem();
                    item.Value = formField.value;
                    item.Field = jFormField.attr("filterField");
                    item.SecondField = jFormField.attr("filterSecondField");
                    item.Type = jFormField.attr("filterType");
                    item.Mode = jFormField.attr("filterMode");
                    //alert("text" +formField.id);
                    //alert(formField.value);
                    //alert(formField.value != '');

                    jF.Items.push(item);
                    jF.Url += item.Field + '=' + item.Value + '&';
                }
            }
            else if (jFormField.attr("type") == "checkbox") {

                if (formField.checked == true) {
                    item = new jFilterItem();
                    item.Value = ((jFormField.attr("filterValue") != undefined) ? jFormField.attr("filterValue") : formField.value);
                    item.Field = jFormField.attr("filterField");
                    item.SecondField = jFormField.attr("filterSecondField");
                    item.Type = jFormField.attr("filterType");
                    item.Mode = jFormField.attr("filterMode");

                    //alert("checkbox" + formField.id);
                    //alert(formField.value);
                    //alert(formField.checked);

                    jF.Items.push(item);
                    jF.UrlHash += '&' + item.Field + '=' + item.Value;
                    //F:{Name=Test&}
                }
            }
        }

        var parentSelect;
        var formFieldsSelectOptions = $('#filters select[jFilter="1"] option:selected');

        for (var k = 0; k < formFieldsSelectOptions.length; k++) {
            var kk = i + k;
            formField = formFieldsSelectOptions.get(k);
            if (formField.value != '') {
                item = new jFilterItem();
                item.Value = formField.value;
                parentSelect = $(formField).parent();
                item.Field = parentSelect.attr("filterField");
                item.Type = parentSelect.attr("filterType");
                item.Mode = parentSelect.attr("filterMode");

                //alert("select" +formField.id);
                //alert(formField.value);

                jF.Items.push(item);
                jF.Url += item.Field + '=' + item.Value + ';';


            }
        }
        //alert(JSON.stringify(jF.Items));

        // alert(jF.Url);
        //document.location.search = jF.Url;

        return jF;
    };

    jF.ToString = function() {
        return JSON.stringify(jF.Items);
    };

    if (filterId != undefined) {
        jF.filterId = filterId;
        jF.Load();
    }
    else { throw "Exception: Pager options ID isn't set."; }
}





/***************************
***  Grid Paging processing
***************************/

function jPager(optionsID) {
    var jP = this;
    jP.optionsID = '';

    jP.UrlHash = ''; 



    jP.offsetPath = '#offset'; 
    jP.limitPath = '#limit'; 
    jP.totalPath = '#total'; 

    jP.options = {

        Offset: 0,
        Limit: 0,
        Total: 0
    };

    jP._fromUrl = function() {
    
        var url = window.location.hash;
        var pPart = jH.getUrlPart(url, 'p=');
        var page = 1;
        
        if (pPart != '') {
            page = parseInt(pPart.substring(2));
        }
        
        jP.SetPage(page);
    }
    jP._toUrl = function(page) {
    
        var url = window.location.hash;
        var pPart = jH.getUrlPart(url, 'p=');
        if (pPart == '') {
            if (url == '') url = 'p=' + page;
            else url = url + '/p=' + page;
        } else {
            url = url.replace(pPart, 'p=' + page);
        }
        window.location.hash = url;
    }

    jP.Load = function() {
        jP._load();
        jP._fromUrl();
        return jP;
    };
    jP._load = function() {
        var po = $("#" + jP.optionsID);
        jP.options.Offset = $(jP.offsetPath, po).val();
        jP.options.Limit = $(jP.limitPath, po).val();
        jP.options.Total = $(jP.totalPath, po).val();
        
        
    };
    jP.Set = function() {
        var po = $("#" + jP.optionsID);
        $(jP.offsetPath, po).val(jP.options.Offset);
        $(jP.limitPath, po).val(jP.options.Limit);
        $(jP.totalPath, po).val(jP.options.Total);
        
        return jP;
    };

    jP.SetPage = function(page) {
        if (jP.options.Limit < 1) jP._load();

        jP.options.Offset = (page - 1) * jP.options.Limit;
        $("#" + optionsID + " " + jP.offsetPath).val(jP.options.Offset);

        jP._toUrl(page);       

    };
    jP.Bind = function(options) {
        jP._bind(options);
        jP.Set();
        jP._fromUrl();
        return jP;
    };
    jP._bind = function(options) {
        jP.options.Offset = options.Offset;
        jP.options.Limit = options.Limit;
        jP.options.Total = options.Total;
        
    };

    jP.Get = function() {
        return JSON.stringify(jP.options);
    };

    jP.Render = function(pagerPath) {
        var output = ''; 
        var from = jP.options.Offset;
        var per_page = jP.options.Limit;
        var count = jP.options.Total;


        var count_pages, from_page, to_page, curr_page;

        if (per_page > 0) {
            count_pages = Math.ceil(count / per_page);
            curr_page = (from / per_page) + 1;

            if (curr_page >= 3) from_page = curr_page - 3;
            else from_page = 1;

            //from_page = (from / per_page) + 1; 

        } else {
            count_pages = 1;
            from_page = 1;
        }
        if (curr_page < 1) curr_page = 1;
        if (from_page < 1) from_page = 1;

        to_page = curr_page + 3;

        if (to_page > count_pages) to_page = count_pages;


        if (curr_page > 1) output = output + '<span class="ctrls" page="' + (curr_page - 1) + '">&larr;prev</span>'; 

        if (from_page > 2) {
            output = output + '<span class="ctrls" page="1">1</span>'; 
            output = output + '<span class="ctrls" page="' + (from_page - 1) + '">...</span>'; 

        }

        if (jP.options.Limit < count) {
            for (var p = from_page; p <= to_page; p++) {
                var css_class = 'ctrls'; 
                if (p == curr_page) css_class = css_class + ' current'; 
                output = output + '<span <span class="' + css_class + '" page="' + p + '">' + p + '</span>'; 
            }
        }
        if ((count_pages - to_page) > 2) {
            output = output + '<span class="ctrls" page="' + (to_page + 1) + '">...</span>'; 
            output = output + '<span class="ctrls" page="' + count_pages + '">' + count_pages + '</span>'; 
        }
        if (curr_page < count_pages) output = output + '<span class="ctrls" page="' + (curr_page + 1) + '">next&rarr;</span>'; 

        output = output + '<span class="total">( Total: ' + count + ' results)</span>'; 

        var pager = $(pagerPath);
        if (pager != undefined)
            pager.html(output);
        else
            document.write(output);
        return jP;
    };
    if (optionsID != undefined) {
        jP.optionsID = optionsID;
    }
    else { throw "Exception: Pager options ID isn't set."; }
}



function jSorting(optionsID) {
    var jS = this;

    jS.options =
    {
        Field: '',
        Direction: 0
    };

    jS.DefaultSortField  = 'Name'; 
    jS.optionsID = ''; 

    jS.ToString = function() {
        return JSON.stringify(jS.options);
    };
    jS._fromUrl = function() {

        var url = window.location.hash;
        var sPart = jH.getUrlPart(url, 's=');
        var field = "";
        var dir = 0;
        var sort = '';

        if (sPart != '') {
            sort = sPart.substring(3, sPart.lastIndexOf(']'));
            var sp = sort.split('|');
            if (sp.length == 2){
                field = sp[0];
                dir = (sp[1] == 'Asc') ? 0 : 1;
            }
        }
        jS.SetField(field);
        jS.SetDir(dir);
    }
    jS._toUrl = function(field, direction) {

        var url = window.location.hash;
        var sPart = jH.getUrlPart(url, 's=');
        if (field == '') field = jS.DefaultSortField;
        var dir = (direction == 0 ? 'Asc' : 'Desc')
        if (sPart == '') {
            if (url == '') url = 's=[' + field + '|' + dir + ']';
            else {
                url = url + '/' + 's=[' + field + '|' + dir + ']';
            }
        } else {

            url = url.replace(sPart, 's=[' + field + '|' + dir + ']');
        }
        window.location.hash = url;
    }


    jS.Load = function() {
        jS._load();
        jS._fromUrl();
        return jS;
    };
    jS._load = function() {
        var sortOptions = $("#" + jS.optionsID);
        jS.options.Field = $("#field", sortOptions).val();
        jS.options.Direction = $("#dir", sortOptions).val();
    };
    jS.FromUrl = function() {
        return jS;
    }
    jS.Bind = function(object) {
        jS._bind(object);
        jS._fromUrl();
        return jS;
    };
    jS._bind = function(object) {
        if (object != undefined) {
            if (object.Field != undefined) jS.options.Field = object.Field;
            if (object.Direction != undefined) jS.options.Direction = object.Direction;
        }        
    };
    jS.Get = function() {
        jS.Load();
        return jS.ToString();
    };
    jS.SetField = function(field) {
        jS.options.Field = field;
        return jS;
    };
    jS.SetDir = function(dir) {
        jS.options.Direction = dir;
        return jS;
    };
    jS.Save = function() {
        var so = $("#" + jS.optionsID);
        $("#field", so).val(jS.options.Field);
        $("#dir", so).val(jS.options.Direction);
        jS._toUrl(jS.options.Field, jS.options.Direction);
        return jS;
    };


    if (optionsID != undefined) {
        jS.optionsID = optionsID;
        jS.Load();
    }
    else { throw "Exception: Sorting options ID isn't set."; }


}


/***************************
***  Modal Panel
***************************/

function ShowPanel(panelID, callback) {

    if (_blur == undefined)
        _blur = $("#Blur");

    _blur.show();
    var panel = $("#" + panelID);
    var pageSize = jH.getPageSize();
    //alert(pageSize);
    //alert(pageSize.height + ", " + pageSize.pageHeight + ", " + pageSize.scrollTop);
    panel.css({ position: 'fixed', top: (pageSize.height - panel.height()) / 2, left: (pageSize.width - panel.width()) / 2 });
    panel.fadeIn(350);
    if (callback != undefined) callback();
}
function ShowPanelTop(panelID, top) {

    if (_blur == undefined)
        _blur = $("#Blur");

    _blur.show();
    var panel = $("#" + panelID);
    var pageSize = jH.getPageSize();
    //alert(pageSize);
    //alert(pageSize.height + ", " + pageSize.pageHeight + ", " + pageSize.scrollTop);
    panel.css({ position: 'fixed', top: top, left: (pageSize.width - panel.width()) / 2 });
    panel.fadeIn(350);
    
}

function ShowContextPanel(panelID, target,  callback) {

    var panel = $("#" + panelID);
    var pageSize = jH.getPageSize();
    //alert(pageSize);
    //alert(pageSize.height + ", " + pageSize.pageHeight + ", " + pageSize.scrollTop);
    var pos = target.position();
    //alert(target.text());
    //alert(pos.top);
    //alert(pos.left);
    //		var top = pos.top;
    //		var left = pos.left + 50;
    panel.css({ position: 'absolute', top: pos.top + target.height() + 5, left: pos.left});
    //alert(panel.html());
    panel.fadeIn(350);
    if (callback != undefined) callback();
}

function ClosePanel(panelID, callback) {
    if (_blur == undefined)
        _blur = $("#Blur");

    if (callback != undefined) callback();

    _blur.hide();
    $("#" + panelID).hide();

}

var infoPanel = new InfoPanel();

function InfoPanel() {

    var panel = this;


    panel.op = {};

    panel.CreateOptions = function() {
        return {
            CssClass: "panel hidden",
            PanelBorder: false,            
            OkCssClass: "btn blue",
            CancelCssClass: "btn blue",
            TitleCssClass: "",
            PanelId: "info-panel",
            Title: "Information",
            BodyHtml: "",
            UseOk: true,
            UseCancel: false,
            OkText: "Ok",
            CancelText: "Cancel",
            okCallback: function() { },
            cancelCallback: function() { },
            initCallback: function() { }
        };
    };
    //var op = panel.op;

    panel.html = "";

    panel.New = function() {
        panel.html = '';
        $("#" + panel.op.PanelId).remove();
        panel.op = panel.CreateOptions();
        return panel;
    };
    panel.CreateError = function(body, title, okCallback, cancelCallback) {
        panel.New();
        panel.op.TitleCssClass = "red-bg";
        return panel.Render(title, body, okCallback, cancelCallback).Open();
    };

    panel.Create = function(body, title, okCallback, cancelCallback) {
        return panel.New().Render(title, body, okCallback, cancelCallback).Open();
    };
    panel.CreateContext = function(body, title, target, okCallback, cancelCallback) {
        panel.New();
        panel.op.UseOk = false;
        panel.op.UseCancel = false;
        panel.op.PanelBorder = true;
        return panel.Render(title, body, okCallback, cancelCallback).OpenContext(target);
    };
    panel.Render = function(title, body, okCallback, cancelCallback) {
        if (title != undefined) panel.op.Title = title;
        panel.op.BodyHtml = body;
        panel.op.okCallback = okCallback;
        panel.op.cancelCallback = cancelCallback;

        panel.html = "<div id=" + panel.op.PanelId + " class='" + panel.op.CssClass + (panel.op.PanelBorder ? " border" : "") + "'>";
        
        if (panel.op.Title != '') panel.html +="<h1 class='" + panel.op.TitleCssClass + "'>" + panel.op.Title + "</h1>";
       
        panel.html +="<div class='cetner'>" + panel.op.BodyHtml;
        if (panel.op.UseOk || panel.op.UseCancel) panel.html += '<br><br>';
        if (panel.op.UseOk)
            panel.html += "<span class='" + panel.op.OkCssClass + "' onclick='infoPanel.OkClick();'>" + panel.op.OkText + "</span> ";
        if (panel.op.UseCancel)
            panel.html += "<span class='" + panel.op.CancelCssClass + "' onclick='infoPanel.CancelClick();'>" + panel.op.CancelText + "</span> ";
        if (panel.op.UseOk || panel.op.UseCancel) panel.html += '<br><br>';
        panel.html += "</div></div>";

        $(document.body).append(panel.html);
        if (panel.op.initCallback != undefined) panel.op.initCallback();
        return panel;
    };
    panel.Open = function() {
        _loading.hide();
        ShowPanel(panel.op.PanelId);
        return panel;
    };

    panel.OpenContext = function(target) {
        _loading.hide();
        ShowContextPanel(panel.op.PanelId, target);
        return panel;
    };
    panel.Close = function() {
        ClosePanel(panel.op.PanelId);
        $("$" + panel.op.PanelId).remove();
        return panel;
    };
    panel.OkClick = function() {
        if (panel.op.okCallback != undefined)
            panel.op.okCallback();
        panel.Close();
        _loading.hide();
        return panel;
    };

    panel.CancelClick = function() {
        if (panel.op.cancelCallback != undefined)
            panel.op.cancelCallback();
        panel.Close();
        _loading.hide();
        return panel;
    };

    panel.toString = function() {
        return panel.html;
    };
    
    
    panel.CreateOptions();
}

/***************************
***  Loading
***************************/
var _blur, _loading;
$(document).ready(function() {
    _blur = $("#Blur");
    _loading = $("#Loading");
    var pageSize = jH.getPageSize();
    _loading.css({ position: 'fixed', top: (pageSize.height - _loading.height()) / 2, left: (pageSize.width - _loading.width()) / 2 });

});

function ShowLoading() {
    if (_blur == undefined)
        _blur = $("#Blur");

    _blur.show();

    _loading.show();
}
function HideLoading() {
    if (_loading == undefined)
        _loading = $("#Blur");

    _blur.hide();
    _loading.hide();
}



/***************************
***  Woking with Cookies
***************************/
function createCookie(name, value, days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    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);
}




/***************************
***  jHelper object
***************************/

var jH = {

    Incr: function(i, j) { return (i + j + 1); },
    Decr: function(i) { return i - 1; },
    IncrOffset: function(i, o) { return i + o + 1; },

    Slug: function(from_id, to_id) {
        var s = $('#' + from_id).val();
        s = s.replace(/\s+/g, "-");
        s = s.replace(/-+/g, "-");
        s = s.replace(/-+$/g, "");
        s = s.replace(/^-+$/g, "");
        $('#' + to_id).val(s.toLowerCase());
    },
    CapStr: function(str) {
        var tempArray = str.split(' ');
        for (var i = 0; i < tempArray.length; i++) {
            tempArray[i] = tempArray[i].charAt(0).toUpperCase() + tempArray[i].substring(1);
        }
        return tempArray.join(' ');
    },
    RemoveStr: function(s, t) {
        i = s.indexOf(t);
        r = "";
        if (i == -1) return s;
        r += s.substring(0, i) + _jH.RemoveStr(s.substring(i + t.length), t);
        return r;
    },
    getPageSize: function() {
        var d = document, w = window, iebody = d.compatMode && d.compatMode != 'BackCompat'
		    ? d.documentElement : d.body;


        var b = d.body;
        var xScroll = (w.innerWidth && w.scrollMaxX)
			    ? w.innerWidth + w.scrollMaxX : Math.max(b.scrollWidth, b.offsetWidth),
		    yScroll = (w.innerHeight && window.scrollMaxY)
			    ? w.innerHeight + w.scrollMaxY : Math.max(b.scrollHeight, b.offsetHeight),
		    pageWidth = jQuery.browser.msie ? iebody.scrollWidth :
			    (d.documentElement.clientWidth || self.innerWidth),
      	    pageHeight = jQuery.browser.msie ? Math.max(iebody.scrollHeight, iebody.clientHeight) :
			    (d.documentElement.clientHeight || self.innerHeight);

        var width = jQuery.browser.msie ? iebody.clientWidth :
			    (d.documentElement.clientWidth || self.innerWidth),
		    height = jQuery.browser.msie ? iebody.clientHeight : self.innerHeight;

        return {
            pageWidth: Math.max(pageWidth, xScroll),
            pageHeight: Math.max(pageHeight, yScroll),
            width: width,
            height: height,
            scrollLeft: jQuery.browser.msie ? iebody.scrollLeft : pageXOffset,
            scrollTop: jQuery.browser.msie ? iebody.scrollTop : pageYOffset
        }
    },
    copy: function(t) {
        if (typeof t == 'undefined') {
            t = '';
        }
        var d = document;
        if (window.clipboardData) {
            window.clipboardData.setData('Text', t);
        }
        else {
            var f = 'flashcopier';
            if (!d.getElementById(f)) {
                var dd = d.createElement('div');
                dd.id = f;
                d.body.appendChild(dd);
            }
            d.getElementById(f).innerHTML = '';
            var i = '<embed src="copy.swf" FlashVars="clipboard=' + encodeURIComponent(t) + '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
            d.getElementById(f).innerHTML = i;
        }
    },
    getUrlPart: function(url, partStart) {
        url = url.replace('#', '');
        var parts = new Array();
        parts = url.split('/');
        for (var i = 0; i < parts.length; i++) {
            var p = parts[i];
            if (p.indexOf(partStart) == 0) return p;
        }
        return '';
    }
};



var _intTimeDelayCounter = 0;
var _timeout;
var lastKeyPressCode;
function AutoCompleteRun(e, delay, callback) {
    //lastKeyPressCode = e.keyCode;
    switch (e.keyCode) {
        case 17: //  ctrl
            break;
        case 16: // shift
            break;
        case 32: // space bar
            break;
        case 37: // left
            break;
        case 38: // up
            break;
        case 39: // right
            break;
        case 40: // down
            break;
        case 188: // ,
            break;
        case 9:  // tab
            break;
        case 13: // return            
        default:
            TimeoutInvoke(delay, callback);
            break;
    }
}
function TimeoutInvoke(delay, callback) {
    _intTimeDelayCounter++;
    var _intChecker = _intTimeDelayCounter;
    //setTimeout("if (i == _intTimeDelayCounter) { " + code + " }", delay);
    if (_timeout) clearTimeout(_timeout);
    _timeout = setTimeout(function() {
        if (_intTimeDelayCounter == _intChecker) callback();
    }, delay);
}