﻿//===== ShowHide elementID ===
function ShowHide(elementID,show) {
    var element = document.getElementById(elementID);
    if (show == null) {
        element.style.display = (element.style.display != "none" || element.style.display == null) ? "none" : "block";
    }
    else {
        element.style.display = (show == true) ? "block" : "none";
    }
}
//===== FadeInFadeOut ===
var TimeToFade = 350.0;
function fade(elementID,show) {
    var element = document.getElementById(elementID);
    if (element == null)
        return;

    if (show != null)
        element.FadeState = (show == true) ? -2 : 2;
    else
        element.FadeState = (element.style.display == 'none') ? -2 : 2;
    
    if (element.FadeState == null) {
        if (element.style.opacity == null || element.style.opacity == ''
       || element.style.opacity == '1')
            element.FadeState = 2;
        else
            element.FadeState = -2;
    }

    if (element.FadeState == 1 || element.FadeState == -1) {
        element.FadeState = element.FadeState == 1 ? -1 : 1;
        element.FadeTimeLeft = TimeToFade - element.FadeTimeLeft;
    }
    else {
        element.FadeState = element.FadeState == 2 ? -1 : 1;
        element.FadeTimeLeft = TimeToFade;
        setTimeout("animateFade(" + new Date().getTime() + ",'" + elementID + "')", 33);
    }
}
//===== aminateFade ===
function animateFade(lastTick, elementID) {
    var curTick = new Date().getTime();
    var elapsedTicks = curTick - lastTick;

    var element = document.getElementById(elementID);

    if (element.FadeTimeLeft <= elapsedTicks) {
        element.style.opacity = element.FadeState == 1 ? '1' : '0';
        element.style.filter = 'alpha(opacity = ' + (element.FadeState == 1 ? '100' : '0') + ')';
        element.FadeState = element.FadeState == 1 ? 2 : -2;
        if (element.style.opacity == 0) {
            element.style.display = "none";
            }
            else {
                element.style.display = "block";
            }  
        return;
    }

    element.FadeTimeLeft -= elapsedTicks;
    var newOpVal = element.FadeTimeLeft / TimeToFade;
    if (element.FadeState == 1)
        newOpVal = 1 - newOpVal;
    if (element.style.opacity != 0) 
        element.style.display = "block";

    element.style.opacity = newOpVal;
    element.style.filter = 'alpha(opacity = ' + (newOpVal * 100) + ')';

    setTimeout("animateFade(" + curTick + ",'" + elementID + "')", 33);
}
//===== TimeStamp ===
function TimeStamp() {
    var stamp = new Date();
    var hours = stamp.getHours();
    var mins = stamp.getMinutes();
    var secs = stamp.getSeconds();
    //if (hours < 10) {
    //    hours = "0" + hours;
    //}
    if (mins < 10) {
        mins = "0" + mins;
    }
    if (secs < 10) {
        secs = "0" + secs;
    }
    var currtime = hours + ":" + mins //+ ":" + secs;
    var element = document.getElementById("timestampelement");
    element.innerHTML = currtime;
}
//===== UpdateProgress ===
function showUpdateProgress(elementID, progelementID, elementDisplayOff) {
    //if (typeof elementID == 'object') { }
    var element;
    if (elementID == null) {
        //Show Progress On Me
        try {
            var evt = window.event || arguments.callee.caller.arguments[0];
            element = evt.target || evt.srcElement;    
        }
        catch (err) {
            //Show FullScreen Update Progress
            var progelement = document.getElementById(progelementID);
            progelement.style.display = "";
            progelement.title = "";
            return
        }
    }
    else {
        //Show Progress On Passed elementID
        element = document.getElementById(elementID);
    }
    if (element.tagName.toUpperCase() == "INPUT" && progelementID == null) {
        //Show Default Update Progress
        element.src = "/./Images/loading.gif";
        element.title = "";
    }
    else if (element.tagName.toUpperCase() != "INPUT" && progelementID == null) {
        //Show Default HTML Update Progress
        element.style.textAlign = "center";
        element.innerHTML = "<table border='0' cellpadding='0' cellspacing='0' style='width: 100%; height: 100%;'><tr>";
        element.innerHTML += "<td valign='middle' style='text-align: center;'>";
        element.innerHTML += "<img alt='Loading ... Please Wait' src='/./Images/loading.gif' />";
        element.innerHTML += "</td></tr></table>";
        element.title = "";
    }
    else if (elementDisplayOff == null) {
        //Show Passed Update Progress
        var progelement = document.getElementById(progelementID);
        element.innerHTML = progelement.innerHTML;
        element.title = "";
    }
    else if (elementDisplayOff == true) {
        //Show Passed Update Progress 
        var progelement = document.getElementById(progelementID);
        progelement.style.display = "";
        progelement.title = "";
    }
    else if (elementDisplayOff == false) {
        //Hide Passed Update Progress And Show Passed elementID
        var progelement = document.getElementById(progelementID);
        progelement.style.display = "";
        progelement.title = "";
        element.style.display = ""; 
    }
}
//===== Ajax ===
var xmlHttp;
var upPanelID;
var upProgressID;
function AjaxRequest(RequestADR, UpdatePanelID, UpdateProgressID, RequestParams) {
    upPanelID = UpdatePanelID;
    upProgressID = UpdateProgressID;
    
    xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null) {
        alert("Your browser does not support AJAX!");
        return;
    }
    var rnd = Math.random();
    if (RequestParams != null) {
        var url = RequestADR + "?" + RequestParams + "&rnd=" + rnd;
    }
    else {
        var url = RequestADR + "?rnd=" + rnd;
    }

    xmlHttp.onreadystatechange = stateChanged;
    xmlHttp.open("POST", url, true);
    xmlHttp.setRequestHeader("Content-Type", "text/html; charset=utf-8")
    xmlHttp.send(null);
}
function stateChanged() {
    if (xmlHttp.readyState == 4) {
        document.getElementById(upPanelID).innerHTML = xmlHttp.responseText;
    }
    else {
        document.getElementById(upPanelID).innerHTML = document.getElementById(upProgressID).innerHTML;
    }
}
function GetXmlHttpObject() {
    var xmlHttp = null;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
    }
    catch (e) {
        // Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}
//===== Show as popup ===
function showPopup(elementID, e, xOffset, yOffset, align) {
    var element = document.getElementById(elementID);
    var Offset = { x: xOffset, y: yOffset };
    element.style.position = "absolute";
    if (align == "right") {
        element.style.right = getPosition(e).x + Offset.x;
    }
    else {
        element.style.left = getPosition(e).x + Offset.x;
    }
    element.style.top = getPosition(e).y + Offset.y;
    fade(elementID, true);
    //element.style.display = "block";
}
function hidePopup(elementID) {
    var element = document.getElementById(elementID);
    element.style.display = "none";
}
//===== Get current cursor position ===
function getPosition(e) {
    e = e || window.event;
    var cursor = { x: 0, y: 0 };
    if (e.pageX || e.pageY) {
        cursor.x = e.pageX;
        cursor.y = e.pageY;
    }
    else {
        var de = document.documentElement;
        var b = document.body;
        cursor.x = e.clientX +
            (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
        cursor.y = e.clientY +
            (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
    }
    return cursor;
}
//===== Set & Get Cookie ===
var exp = new Date();
exp.setTime(exp.getTime() + (1000 * 60 * 60 * 24 * 30));
//===== Set Cookie ===
function setCookie(name, value, expires) {
    document.cookie = name + "=" + escape(value) + "; path=/" + ((expires == null) ? "; expires=" + exp.toGMTString() + ";" : "; expires=" + expires.toGMTString() + ";");
}
//===== Get Cookie ===
 function getCookie(name) {

    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((!start) && (name != document.cookie.substring(0, name.length))) {
        return null;
    }
    if (start == -1) return null;
    var end = document.cookie.indexOf(';', len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len, end));
}
//===== Get Width ===
function getWidth() {
    var x = 0;
    if (self.innerHeight) {
        x = self.innerWidth;
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
        x = document.documentElement.clientWidth;
    }
    else if (document.body) {
        x = document.body.clientWidth;
    }
    return x;
}
//===== Get Height ===
function getHeight() {
    var y = 0;
    if (self.innerHeight) {
        y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
        y = document.documentElement.clientHeight;
    }
    else if (document.body) {
        y = document.body.clientHeight;
    }
    return y;
}
//===== Get KeyPress Enter ===
function enterHere(e) {
    e = e || window.event;
    var code = e.keyCode || e.which;
    return (code == 13) ? true : false;
}
//===== TypingText - Text TypeEffect===
/*
An object-oriented Typing Text script, to allow for multiple instances.
A script that causes any text inside any text element to be "typed out", one letter at a time. Note that any HTML tags will not be included in the typed output, to prevent them from causing problems. Tested in Firefox v1.5.0.1, Opera v8.52, Konqueror v3.5.1, and IE v6.
Browsers that do not support this script will simply see the text fully displayed from the start, including any HTML tags.

Functions defined:
TypingText(element, [interval = 100,] [cursor = "",] [finishedCallback = function(){return}]):
Create a new TypingText object around the given element.  Optionally
specify a delay between characters of interval milliseconds.
cursor allows users to specify some HTML to be appended to the end of
the string whilst typing.  Optionally, can also be a function which
accepts the current text as an argument.  This allows the user to
create a "dynamic cursor" which changes depending on the latest character
or the current length of the string.
finishedCallback allows advanced scripters to supply a function
to be executed on finishing.  The function must accept no arguments.

TypingText.run():
Run the effect.

static TypingText.runAll():
Run all TypingText-enabled objects on the page.
*/
TypingText = function(element, interval, finishedCallback) {
    cursor = function(i) { var ar = new Array("_", "&nbsp;", "_", "&nbsp;"); return " " + ar[i.length % ar.length]; }
    if ((typeof document.getElementById == "undefined") || (typeof element.innerHTML == "undefined")) {
        this.running = true; // Never run.
        return;
    }
    this.element = element;
    this.finishedCallback = (finishedCallback ? finishedCallback : function() { return; });
    this.interval = (typeof interval == "undefined" ? 100 : interval);
    this.origText = this.element.innerHTML;
    this.unparsedOrigText = this.origText;
    this.cursor = (cursor ? cursor : "");
    this.currentText = "";
    this.currentChar = 0;
    this.element.typingText = this;
    if (this.element.id == "") this.element.id = "typingtext" + TypingText.currentIndex++;
    TypingText.all.push(this);
    this.running = false;
    this.inTag = false;
    this.tagBuffer = "";
    this.inHTMLEntity = false;
    this.HTMLEntityBuffer = "";
}
TypingText.all = new Array();
TypingText.currentIndex = 0;
TypingText.runAll = function() {
    for (var i = 0; i < TypingText.all.length; i++) TypingText.all[i].run();
}
TypingText.prototype.run = function() {
    if (this.running) return;
    if (typeof this.origText == "undefined") {
        setTimeout("document.getElementById('" + this.element.id + "').typingText.run()", this.interval); // We haven't finished loading yet.  Have patience.
        return;
    }
    this.element.style.display = "";
    if (this.currentText == "") this.element.innerHTML = "";
    //  this.origText = this.origText.replace(/<([^<])*>/, "");     // Strip HTML from text.
    if (this.currentChar < this.origText.length) {
        if (this.origText.charAt(this.currentChar) == "<" && !this.inTag) {
            this.tagBuffer = "<";
            this.inTag = true;
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == ">" && this.inTag) {
            this.tagBuffer += ">";
            this.inTag = false;
            this.currentText += this.tagBuffer;
            this.currentChar++;
            this.run();
            return;
        } else if (this.inTag) {
            this.tagBuffer += this.origText.charAt(this.currentChar);
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == "&" && !this.inHTMLEntity) {
            this.HTMLEntityBuffer = "&";
            this.inHTMLEntity = true;
            this.currentChar++;
            this.run();
            return;
        } else if (this.origText.charAt(this.currentChar) == ";" && this.inHTMLEntity) {
            this.HTMLEntityBuffer += ";";
            this.inHTMLEntity = false;
            this.currentText += this.HTMLEntityBuffer;
            this.currentChar++;
            this.run();
            return;
        } else if (this.inHTMLEntity) {
            this.HTMLEntityBuffer += this.origText.charAt(this.currentChar);
            this.currentChar++;
            this.run();
            return;
        } else {
            this.currentText += this.origText.charAt(this.currentChar);
        }
        this.element.innerHTML = this.currentText;
        this.element.innerHTML += (this.currentChar < this.origText.length - 1 ? (typeof this.cursor == "function" ? this.cursor(this.currentText) : this.cursor) : "");
        this.currentChar++;
        setTimeout("document.getElementById('" + this.element.id + "').typingText.run()", this.interval);
    } else {
        this.currentText = "";
        this.currentChar = 0;
        this.running = false;
        setTimeout("document.getElementById('" + this.element.id + "').typingText.finished()", 3000);
        //this.element.style.display = "none";
        //this.finishedCallback()
    }
TypingText.prototype.finished = function() {
        this.element.style.display = "none";
        this.finishedCallback() 
        }
}

//===== Standard Persian keyboard driver for JavaScript ===
/* isiri2901.js - Standard Persian keyboard driver for JavaScript
*
* Copyright (C) 2000  Roozbeh Pournader
* Copyright (C) 2003, 2005  Behdad Esfahbod
* Copyright (C) 2005, 2006  Pooya Karimian
* Copyright (C) 2005  Behnam Esfahbod
* Copyright (C) 2005  Artyom Lukanin
*
* ChangeLog:
* Mar 05, 2005  Pooya Karimian, FireFox/Mozilla support added.
* Mar 20, 2005  Behdad Esfahbod, random fixes in Firefox support.
* Apr 14, 2005  Behnam Esfahbod, U+0654, U+0670, U+00F7 added.
* Apr 21, 2005  Behdad Esfahbod, Minimal Opera 8.0 support added.
*               Alt+Ctrl+anything now is known to switch language.
* Sep 06, 2005  Artyom Lukanin, FireFox 1.0.6 support added.
* Sep 09, 2005  Behdad Esfahbod, Added fallback support back in,
*               removed Opera code that doesn't was not worth it.
* Sep 09, 2005  Behdad Esfahbod, Make toggleDir() with no object
*               passed changing language, actually work.
* Sep 09, 2005  Added U+FDFC RIAL SIGN!
* Sep 09, 2005  Assigned U+0653 to shift+X.
* Dec 02, 2005  Pooya Karimian, Fixing vertical & horizontal scrolling
* Apr 13, 2006  Pooya Karimian, initKeyEvent is back in Firefox 1.5.0.2 (FF Bug#303713)
*
* Licensed under GNU GPL.
*/

var isiri2901_lang = 1;        // 1: Persian, 0: English
var isiri2901_nativelang = 0;  // 1: Persian, 0: English

// Persian keyboard map based on ISIRI-2901

var isirikey = [
  0x0020, 0x0021, 0x061B, 0x066B, 0xFDFC, 0x066A, 0x060C, 0x06AF,
  0x0029, 0x0028, 0x002A, 0x002B, 0x0648, 0x002D, 0x002E, 0x002F,
  0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7,
  0x06F8, 0x06F9, 0x003A, 0x06A9, 0x003E, 0x003D, 0x003C, 0x061F,
  0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
  0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
  0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
  0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
  0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
  0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
  0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
  0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
];

// on Alt+Ctrl+anything, switch language
function PersianKeyDown(e) {
    if (window.event)
        e = window.event;
    if (e.ctrlKey && e.altKey) {
        if (isiri2901_lang == 0)
            setPersian();
        else
            setEnglish();
        try {
            e.preventDefault();
        } catch (err) {
        }
        return false;
    }
    return true;
}

var pk_test_ev;

function PersianKeyPress(e) {
    var key;
    var obj;


    if (window.event) {
        e = window.event;
        obj = e.srcElement;
        key = e.keyCode;
    } else {
        obj = e.target;
        key = e.charCode;
    }

    if (e.bubbles == false)
        return true;

    //   This cannot be used anymore, in FF 1.5.0.2, as a new event will call keypress again.
    //  Change to English, if user is using an OS non-English keyboard
    if (key >= 0x00FF) {
        isiri2901_nativelang = 1;
        setPersian();
    } else
        if (isiri2901_nativelang == 1) {
        isiri2901_nativelang = 0;
        setEnglish();
    }


    // Avoid processing if control or higher than ASCII
    // Or ctrl or alt is pressed.
    if (key < 0x0020 || key >= 0x007F || e.ctrlKey || e.altKey || e.metaKey)
        return true;

    if (isiri2901_lang == 1) { //If Persian

        // rewrite key
        var newkey;
        if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
            newkey = 0x200C;
        else
            newkey = isirikey[key - 0x0020];

        if (newkey == key)
            return true;


        try {
            // Gecko 
            var new_event = document.createEvent("KeyEvents");
            new_event.initKeyEvent("keypress", false, true, document.defaultView, false, false, false, false, 0, newkey);
            obj.dispatchEvent(new_event);
            e.preventDefault();
        } catch (err) {
            try {
                // Windows
                e.keyCode = newkey;
            } catch (err) {
                try {
                    // Gecko after banning fake key emission (FF 1.0.6 to FF 1.5.0.1)
                    // Try inserting at cursor position
                    pnhMozStringInsert(obj, String.fromCharCode(newkey));
                    e.preventDefault();
                } catch (err) {
                    // Everything else, simply add to the end of buffer
                    obj.value += String.fromCharCode(newkey);
                    e.preventDefault();
                }
            }
        }
    }
    return true;
}


function setPersian(obj, quiet) {
    isiri2901_lang = 1;
    if (obj) {
        obj.style.textAlign = "right";
        obj.style.direction = "rtl";
        obj.focus();
    }
    if (!quiet)
        window.defaultStatus = "Persian Keyboard (Press Ctrl+Alt+Space to change to English)";
}


function setEnglish(obj, quiet) {
    isiri2901_lang = 0;
    if (obj) {
        obj.style.textAlign = "left";
        obj.style.direction = "ltr";
        obj.focus();
    }
    if (!quiet)
        window.defaultStatus = "English Keyboard (Press Ctrl+Alt+Space to change to Persian)";
}


function toggleDir(obj, quiet) {
    var isrtl = 0;
    if (obj)
        isrtl = obj.style.direction != 'ltr';
    else
        isrtl = isiri2901_lang;
    if (isrtl)
        setEnglish(obj, quiet);
    else
        setPersian(obj, quiet);
}

// Inserts a string at cursor
function pnhMozStringInsert(elt, newtext) {
    var posStart = elt.selectionStart;
    var posEnd = elt.selectionEnd;
    var scrollTop = elt.scrollTop;
    var scrollLeft = elt.scrollLeft;

    elt.value = elt.value.slice(0, posStart) + newtext + elt.value.slice(posEnd);
    var newpos = posStart + newtext.length;
    elt.selectionStart = newpos;
    elt.selectionEnd = newpos;
    elt.scrollTop = scrollTop;
    elt.scrollLeft = scrollLeft;
    elt.focus();

}

