﻿function keyPressed(e)
{
    return IsIE() ? window.event.keyCode : e.which;
}

function focusInEventName()
{
    var eventName = "focus";
    if (IsIE()) eventName = "focusin";
    if (IsSafari()) eventName = "mousedown";
    return eventName;
}

function eventSourceElement(e)
{
    return (window.Event) ? e.target : window.event.srcElement;
}

function getNextSibling(startBrother)
{
    if(IsIE())
    {
        return startBrother.nextSibling;
    }

    var endBrother = startBrother.nextSibling;
    while(endBrother != null && endBrother.nodeType == 3 )
    {
        endBrother = endBrother.nextSibling;
    }
    return endBrother;
}

function showCallStack()
{
    var f = showCallStack, result = "Call stack:\n";

	while((f=f.caller)!==null)
	{
        var sFunctionName = f.toString().match(/^function (\w+)\(/);
        sFunctionName = (sFunctionName) ? sFunctionName[1] : 'anonymous function';
        result += sFunctionName;
        result += getArguments(f.toString(), f.arguments);
        result += "\n";
    }
    return result;
}

function getArguments(sFunction, a) 
{
    var i = sFunction.indexOf(' ');
    var ii = sFunction.indexOf('(');
    var iii = sFunction.indexOf(')');
    var aArgs = sFunction.substr(ii + 1, iii - ii - 1).split(',');
    var sArgs = '';
	for(var i=0; i<a.length; i++) 
	{
        var q = ('string' == typeof a[i]) ? '"' : '';
        sArgs += ((i > 0) ? ', ' : '') + (typeof a[i]) + ' ' + aArgs[i] + ':' + q + a[i] + q + '';
    }
    return '(' + sArgs + ')';
}

function debugTrace(text)
{
    var debugWindow = window.open('', 'debug', 'width=600,height=400');
    debugWindow.document.writeln('<hr/>');
    debugWindow.document.writeln('<xmp>' + text + '</xmp>');
}

function InsertAdjacentElementAfterEnd(srcEle,desEle)
{
    if (getNextSibling(srcEle))
        srcEle.parentNode.insertBefore(desEle, srcEle.nextSibling);
    else
        srcEle.parentNode.appendChild(desEle);
}

function CreateTextRange(element,format)
{
    if (undefined != document.selection)//IE
    {
        if (element.value == '') element.value = format;
        var range = element.createTextRange();
        range.collapse();
        range.select();
    }
    else//FF or safari
    {
	    if ( element.value == '' || element.valueOf==format) 
	    {
            element.value = format;
            element.selectionStart = element.selectionEnd = 0;
        }
    }
}

function ParentWindow(ele)
{
    return IsIE() ? ele.ownerDocument.parentWindow : ele.ownerDocument.defaultView;
}

function getOuterHTML(object) 
{
    if(IsIE())
    {
        return object.outerHTML;
    }
    var element;
    if (!object) return null;
    element = document.createElement("div");
    element.appendChild(object.cloneNode(true));
    return element.innerHTML;
}

function ReplaceOuterHTML(obj,content)
{
    $(obj).replaceWith(content);
}

function getOwningElement(object)
{
    return (IsIE()) ? object.owningElement : object.ownerNode;
}


function stopEvent(e)
{
    if (window.Event)
        e.preventDefault();
    else
        e.returnFalse = false;
}


//for firefox
function setText(object, position, replacement, origValue)
{
    (origValue = origValue.split(''))[position - 1] = replacement;
    origValue = origValue.join('');
    object.value = origValue;
}


function documentChildrens()
{
    return ChildrensOf(document.body);
}

function ChildrensOf(element)
{
    return IsIE() ? element.children : element.childNodes;
}



function cleanWhitespace(node) {
    var notWhitespace = /\S/;
    if (IsIE())
        return;
    for (var x = 0; x < node.childNodes.length; x++) {
        var childNode = node.childNodes[x]
        if ((childNode.nodeType == 3) && (!notWhitespace.test(childNode.nodeValue))) {
            // that is, if it's a whitespace text node
            node.removeChild(node.childNodes[x])
            x--
        }
        if (childNode.nodeType == 1) {
            // elements can have text child nodes of their own
            cleanWhitespace(childNode)
        }
    }
}


function IsIE()
{
    return (navigator.appName == "Microsoft Internet Explorer");
}

function IsSafari()
{
    return navigator.userAgent.indexOf("Safari") != -1;
}

function FireClick(element)
{
    var e = document.createEvent('HTMLEvents');
    e.initEvent('click', false, false);
    element.dispatchEvent(e);
}

function MoveRows(tableBodyElement,fromRowIndex,toRowIndex)
{
    var rows = tableBodyElement.rows;
    var delRow = rows[fromRowIndex];
    var row2 = rows[toRowIndex];
    if (fromRowIndex == toRowIndex || delRow == null || row2 == null) return;

    var newRow = $(delRow).clone(true).context;
    var p = delRow.parentNode;
    p.removeChild(delRow);
    p.insertBefore(newRow, row2);
}

function ClickOn(element)
{
    element.click ? element.click() : FireClick(element);
}

function OnKeyPress(e) 
{
    if (!e) e = window.event; //works cross browser
    var inputBox = eventSourceElement(e);
    var keyCode = keyPressed(e);
    if (undefined != document.selection)//IE
    {
        e.returnValue = false;
        var chr = String.fromCharCode(keyCode);
        if (chr.match(/\s/)) return;
	if (!isNumericValue(keyCode))
	{
            return;
        }
        var tr = range = document.selection.createRange();

        if (tr.text == '') tr.moveEnd("character");
        while (tr.text.match(/\W/)) {
            tr.move("character");
            tr.select();
            if (tr.text == '') tr.moveEnd("character");
        }

        var tr = document.selection.createRange();
        tr.move("character", 0);
        tr.moveEnd("character", 1);

        if (chr.match(/\w/)) {
            if (tr.text != '')
                tr.text = chr;
        } else {
            var trn = document.selection.createRange();
            if (trn.text == '') trn.moveStart("character", -1);

            while ((trn.text != '') && (!trn.text.match(/\W/)) && (tr.text != '') && (!tr.text.match(/\W/))) {
                trn.moveEnd("character", -1);
                trn.text = '0';
                tr.text = '';
                tr.moveEnd("character");
                trn.moveStart("character");
                if (trn.text == '') trn.moveStart("character", -1);
            }

            tr.moveEnd("character", -1);
        }

        tr.moveEnd("character");
        while (tr.text.match(/\W/)) {
            tr.moveStart("character");
            tr.select();
            tr.moveEnd("character");
        }
    }
    else//FF or safari
    {
        if (inputBox.value.length == 10 && inputBox.selectionEnd == 10) {
            stopEvent(e);
            return;
        }
        e.preventDefault();
        if (keyCode == 8 || keyCode == 46) return;
        var keyCode = keyPressed(e);
        var chr = String.fromCharCode(keyCode);
        if (chr.match(/\s/)) return;
	    if (!isNumericValue(keyCode))
	    {
            return;
        }

        var position = inputBox.selectionStart + 1;

	    if(position==3 || position==6)
	    {
            position = position + 1;
        }
        setText(inputBox, position, chr, inputBox.value);
        inputBox.selectionStart = position;
        inputBox.selectionEnd = position;
        window.getSelection().selectionStart = position;
        window.getSelection().selectionEnd = position;
        inputBox.focus();

    }
}


function OnKeyDown(e,format)
{
    if (!e) e = window.event;
    var inputBox = eventSourceElement(e);
    var keyCode = keyPressed(e);
    if (!IsIE() && !IsSafari() && keyCode == 9) { inputBox.blur(); } //tab
    // make delete key not work through non-word charecters
	if (keyCode == 46)
	{
        inputBox.value = '';
        e.returnValue = false;
    }
    //backspace
	if (keyCode == 8) 
	{
        if (undefined != document.selection)//IE
        {
            var tr = document.selection.createRange();
            tr.setEndPoint("EndToStart", tr);

            tr.moveStart("character", -1);
		    while (tr.text.match(/\W/)) 
		    {
                tr.moveStart("character", -1);
                tr.moveEnd("character", -1);
            }
            tr.moveStart("character");

            var trn = tr.duplicate();
            trn.moveStart("character", -100);
            var pos = trn.text.length;
            var repl = format.charAt(pos - 1);

            tr.moveStart("character", -1);
            tr.text = repl;

            tr.move("character", -1);

            tr.moveStart("character", -1);
		    while (tr.text.match(/\W/))
		    {
                tr.moveStart("character", -1);
                tr.moveEnd("character", -1);
            }
            if (tr.text != '') tr.moveStart("character");

            tr.select();

            e.returnValue = false;

	        if (this.value == '') 
	        {
                inputBox.value = format;
                var range = inputBox.createTextRange();
                range.collapse();
                range.select();
            }
        }
        else//firefox,safari
        {
            var origValue = inputBox.value;
            var tr = window.getSelection();
            tr.selectionStart = inputBox.selectionStart;
            tr.selectionEnd = inputBox.selectionEnd;
            tr.selectionEnd = tr.selectionStart;
	        while (tr.toString().match(/\W/)) 
	        {
                tr.selectionStart = tr.selectionStart - 1;
                tr.selectionEnd = tr.selectionEnd - 1;
            }

            var trn;
            if(undefined!=tr.getRangeAt)
            {
                trn = tr.getRangeAt(0).cloneRange();
                var contents = inputBox.value.substr(0, tr.selectionEnd);
                trn.setStart(inputBox, 0);
                var pos = tr.selectionEnd - trn.startOffset;
                var repl = format.charAt(pos - 1);
                setText(inputBox, pos, repl, origValue);
            }

            if (tr.toString() != '') tr.selectionStart = 0;
            inputBox.selectionStart = pos - 1;
            inputBox.selectionEnd = pos - 1;
            inputBox.focus();
            e.preventDefault();
        }
    }
}

function OnKeyUp(e,format) 
{	
    if (!e) e = window.event;
    var inputBox = eventSourceElement(e);
    if (inputBox.value == '')
    {
        if (undefined != document.selection)//IE
        {
            inputBox.value = format;
            var range = inputBox.createTextRange();
            range.collapse();
            range.select();
        }
        else//FF or safari
        {
            inputBox.value = format;
            inputBox.selectionStart = inputBox.selectionEnd = 0;
        }
    }
}

function GetIFrameDocument()
{
    return IsIE() ? window.frames.GenericIframe.document : document.getElementById('GenericIframe').contentDocument;
}

