/**
 * MODALDIALOG FUNCTIONS -
 *
 * @require ../css/ModalDialog.css
 * @require ../css/mask.png
 *
 */

/**
 * X-browser event handler attachment and detachment
 * TH: Switched first true to false per http://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html
 *
 * @argument obj - the object to attach event to
 * @argument evType - name of the event - DONT ADD "on", pass only "mouseover", etc
 * @argument fn - function to call
 */
function addEvent(obj, evType, fn){
 if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
 } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
 } else {
    return false;
 }
}
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

// GLOBAL VARIABLES
var glCurrentZIndex = 0;
var garrstrTabbableTags = new Array("A", "BUTTON", "TEXTAREA", "INPUT", "IFRAME");
var garrbDisabledTags = new Array();
var garrwinParent = new Array();
var gdivCurrentModalDialog = null;
var gifrCurrentFrame = null;
var glInitialX = -1;
var glInitialY = -1;
var gW3C = (document.getElementById) ? true : false;
var gNS4 = (document.layers) ? true : false;
var gIE5 = (gW3C && document.all) ? true : false;
var gNS6 = (gW3C && !document.all) ? true: false;
var gOP7 = (window.opera && document.createComment) ? true : false;

/**
 * Code below taken from -
 * http://www.evolt.org/article/document_body_doctype_switching_and_more/17/30655/
 *
 * Modified 4/22/04 to work with Opera/Moz (by webmaster at subimage dot com)
 *
 * Gets the full width/height because it's different for most browsers.
 */
function getViewportHeight() {
    if (window.innerHeight!=window.undefined) {
	return window.innerHeight;
    }
    if (document.compatMode == 'CSS1Compat') {
        return document.documentElement.clientHeight;
    }
    if (document.body) {
        return document.body.clientHeight; 
    }
    return window.undefined; 
}

function getViewportWidth() {
    if (window.innerWidth != window.undefined) {
        return window.innerWidth; 
    }
    if (document.compatMode == 'CSS1Compat') {
        return document.documentElement.clientWidth;
    }
    if (document.body) {
        return document.body.clientWidth; 
    }
    return window.undefined; 
}

/**
 * disableElements
 */
function disableElements() {
    var docCurrentDocument = window.document;

    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    delete garrbDisabledTags[glCurrentZIndex];
    garrbDisabledTags[glCurrentZIndex] = new Array()

    for (var i = 0; i < garrstrTabbableTags.length; i++) {
	var arrtagElements
	        = docCurrentDocument.getElementsByTagName(garrstrTabbableTags[i]);
	for (var j = 0 ; j < arrtagElements.length; j++) {
  	    garrbDisabledTags[glCurrentZIndex][i + j] = arrtagElements[j].disabled;
      	    arrtagElements[j].disabled = true;
	}
    }
}

function enableElements() {
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    for (var i = 0; i < garrstrTabbableTags.length; i++) {
	var arrtagElements
	        = docCurrentDocument.getElementsByTagName(garrstrTabbableTags[i]);	
	for (var j = 0 ; j < arrtagElements.length; j++) {	    
	    arrtagElements[j].disabled = garrbDisabledTags[glCurrentZIndex][i + j];
	}
    }
}

/**
 * hideMainIFrame - Ekrandaki iframe kontrollerini
 * gizler. Opera tarayicilar icin
 *
 * @return void
 */
function hideMainIFrame() {
    if (garrwinParent[glCurrentZIndex]
            && ("PopupFrame" + (glCurrentZIndex - 1))
	    == garrwinParent[glCurrentZIndex].name) {
         
	 ifrFrame = document.getElementById(garrwinParent[glCurrentZIndex].name);
	 
	 if (ifrFrame) {
	     ifrFrame.style.display = "none";
	 }
    }
}

/**
 * showMainIFrame - Onceden gizlenmis iframe kontrollerini
 * gosterir
 *
 * @return void
 */
function showMainIFrame() {
    if (garrwinParent[glCurrentZIndex]
            && ("PopupFrame" + (glCurrentZIndex - 1))
	    == garrwinParent[glCurrentZIndex].name) {
         
	 ifrFrame = document.getElementById(garrwinParent[glCurrentZIndex].name);
	 
	 if (ifrFrame) {
	     ifrFrame.style.display = "block";
	 }
    }
}

/**
 * hideSelectBoxes - Ekrandaki combobox kontrollerini
 * gizler
 *
 * @return void
 */
function hideSelectBoxes() {
    var i = 0;
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    
    while (selControl != null) {
        i++;    
        selControl.style.visibility="hidden";
	selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    }
}

function beginDrag(lModalDialogIndex) {
    gdivCurrentModalDialog = document.getElementById("divModalDialog" + lModalDialogIndex);
    gifrCurrentFrame = document.getElementById("ifrFrame" + lModalDialogIndex);
    
    if (!gdivCurrentModalDialog || !gifrCurrentFrame) {
        return;
    }
    
    // Hide iframe
    gifrCurrentFrame.style.display = "none";
    
    if (gNS4 && gNS6) {
        document.captureEvents(Event.MOUSEMOVE);
	document.captureEvents(Event.MOUSEUP);
    }
    
    document.onmousemove = dragModalDialog;
    document.onmouseup = endDrag;
    
    glInitialX = -1;
    glInitialY = -1;
}

function endDrag() {
    if (document.layers) {
        document.releaseEvents(Event.MOUSEMOVE);
	document.releaseEvents(Event.MOUSEUP);
    }
    
    document.onmousemove = null;
    document.onmouseup = null;
    
    // Hide iframe
    gifrCurrentFrame.style.display = "block";
    
    gifrCurrentFrame = null;
    gdivCurrentModalDialog = null;
}

function dragModalDialog(e) {
    if (gIE5 && !gW3C && (event.button != 1)) {
        endDrag();
	return;
    } else if (gW3C && !gIE5 && (e.which != 1) && (e.which != 19)) {
        endDrag();
	return;
    }

    if (glInitialX < 0) {
        glInitialX = ((gIE5) ? (event.clientX + document.body.scrollLeft) : e.pageX)
	        - parseInt(gdivCurrentModalDialog.style.left);
        glInitialY = ((gIE5) ? (event.clientY + document.body.scrollTop) : e.pageY)
	        - parseInt(gdivCurrentModalDialog.style.top);
    }

    if (gdivCurrentModalDialog) {
        gdivCurrentModalDialog.style.left
	        = ((gIE5) ? (event.clientX + document.body.scrollLeft) : e.pageX)
		- glInitialX;
	gdivCurrentModalDialog.style.top
	        = ((gIE5) ? (event.clientY + document.body.scrollTop) : e.pageY)
		- glInitialY;
	
	gdivCurrentModalDialog.style.left
	        = (gdivCurrentModalDialog.style.left < 0)
		? 0 : gdivCurrentModalDialog.style.left;
	gdivCurrentModalDialog.style.top
	        = (gdivCurrentModalDialog.style.top < 0)
		? 0 : gdivCurrentModalDialog.style.top;
    }
    
    resizeScreenMask();
}

/**
 * showSelectBoxes - Onceden gizlenmis olan combobox
 * kontrollerini gosterir
 *
 * @return void
 */
function showSelectBoxes() {
    var i = 0;
    var docCurrentDocument = window.document;
    
    if (garrwinParent[glCurrentZIndex]) {
        docCurrentDocument = garrwinParent[glCurrentZIndex].document;
    }

    selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    
    while (selControl != null) {
        i++;    
        selControl.style.visibility="visible";
	selControl = docCurrentDocument.getElementsByTagName('SELECT')[i];
    }
}

/**
 * showScreenMask - Ekran uzerine saydam bir ortu
 * gecirerek, alttaki link, resim, combo, textbox
 * gibi kontrollerin aktif olmasini engeller
 *
 * @return void
 */
function showScreenMask() {
    eleBody = document.getElementsByTagName('body')[0];
    divMask = document.createElement('div');
    divMask.id = "divScreenMask" + glCurrentZIndex;
    divMask.className = "divModalDialogScreenMask";
    eleBody.appendChild(divMask);
    
    resizeScreenMask();
}

/**
 * hideScreenMask - Ekran uzerine olusturulan saydam ortuyu
 * kaldirir
 *
 * @return void
 */
function hideScreenMask() {
    eleBody = document.getElementsByTagName('body')[0];
    divMask = document.getElementById("divScreenMask" + glCurrentZIndex);

    if (eleBody && divMask) {
        eleBody.removeChild(divMask);
    }
}

/**
 * resizeScreenMask - Ekran uzerineki saydam
 * ortunun boyutunu yeniden duzenle
 *
 * @return void
 */
function resizeScreenMask() {
    var eleBody = document.getElementsByTagName('body')[0];

    var lCurrentHeight = getViewportHeight();
    var lCurrentWidth = getViewportWidth();
    

    for (var i = 1; i <= glCurrentZIndex; i++) {
	divMask = document.getElementById("divScreenMask" + i);    
        divMask.style.left = document.body.scrollLeft;
        divMask.style.width = lCurrentWidth;
        divMask.style.top = document.body.scrollTop;
        divMask.style.height = lCurrentHeight;
    }
}

/**
 * initializeModalDialog - Modal formunu gostermek
 * icin gerekli temel islemleri gerceklestirir
 *
 * @param winParent [window][in]: Parent window
 *
 * @return void
 */
function initializeModalDialog(winParent) {
    glCurrentZIndex++;
    
    garrwinParent[glCurrentZIndex] = winParent;

    // Ekrani %100 kaplamis bir div goster.
    showScreenMask();
    
    hideSelectBoxes();
    
    if (gOP7) {
        hideMainIFrame();
    }
    
    disableElements();
    
    addEvent(window, "resize", resizeScreenMask);
    addEvent(window, "scroll", resizeScreenMask);
}

/**
 * finalizeModalDialog - Modal formu kapatildiktan
 * sonraki islemleri gerceklestirir
 *
 * @return void
 */
function finalizeModalDialog() {
    removeEvent(window, "resize", resizeScreenMask, true);
    removeEvent(window, "scroll", resizeScreenMask, true);

    enableElements();
    showSelectBoxes();
    
    if (gOP7) {
        showMainIFrame();
    }
    
    hideScreenMask();

    glCurrentZIndex--;
}

/**
 * createModalDialog - Modal formunda bir form yaratir.
 *
 * @param strCaption: Form basligi
 * @param strURL: Pencerenin gosterecegi adres
 * @param lLeft: Pencerenin sagdan konumu
 * @param lTop: Pencerenin ustten konumu
 * @param lWidth: Pencerenin genisligi
 * @param lHeight: Pencerenin yuksekligi
 *
 * @return Yaratilan Modal dialog div referansi
 * dondurulur
 */
function createModalDialog(strCaption, strURL, lLeft, lTop, lWidth, lHeight) {
    eleBody = document.getElementsByTagName('body')[0];
    divModalDialog = document.createElement('div');
    divModalDialog.id = "divModalDialog" + glCurrentZIndex;
    divModalDialog.className = "divModalDialog";
    
    divModalDialog.style.left = lLeft;
    divModalDialog.style.top = lTop;
    divModalDialog.style.width = lWidth;
    divModalDialog.style.height = lHeight;    

    // Baslik degeri 35 karakterden uzunsa 35 karaktere
    // ... koyarak tamamla
    if (strCaption.length > 35) {
        strCaption = strCaption.substring(0, 32) + "...";
    }

    divModalDialog.innerHTML = "<table "
            + " border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"tableModalDialogOuter\">"
            + "<tr>"
            + "<td class=\"tdModalDialogHeader\"><table onMouseDown=\"beginDrag(" + glCurrentZIndex + ");\" width=\"100%\" border=\"0\""
            + " cellpadding=\"0\" cellspacing=\"0\" class=\"tableModalDialogTitle\">"
            + "<tr>"
            + "<td class=\"tdModalDialogTitle\">" + strCaption + "</td>"
            + "<td class=\"tdModalDialogDialogButtons\">"
	    + "<img src=\"Assets/Images/close.gif\" onClick=\"closeModalDialog();\">"
	    + "</td>"
            + "</tr>"
            + "</table></td>"
            + "</tr>"
            + "<tr>"
            + "<td class=\"tdModalDialogContent\"><iframe class=\"iframeModalDialogContent\""
            + " src=\"" + strURL + "\" style=\"width:100%;height:100%;\""
            + " scrolling=\"auto\" frameborder=\"0\" id=\"ifrFrame"
	    + glCurrentZIndex
            + "\" name=\"PopupFrame" + glCurrentZIndex
	    + "\" width=\"100%\" height=\"100%\">&nbsp;</iframe>"
            + "</td>"
            + "</tr>"
            + "</table>";
    
    eleBody.appendChild(divModalDialog);

    return divModalDialog;    
}

/**
 * destroyModalDialog - Son yaratilmis olan formu yok eder.
 *
 * @return void
 */
function destroyModalDialog() {
    eleBody = document.getElementsByTagName('body')[0];
    divModalDialog = document.getElementById("divModalDialog" + glCurrentZIndex);
    
    if (eleBody && divModalDialog) {    
        eleBody.removeChild(divModalDialog);
    }
}

/**
 * showModalDialog - Modal formunda bir form gosterir.
 *
 * @param winParent [window][in]: Parent window
 * @param strCaption [String][in]: Form basligi
 * @param strURL [String][in]: Pencerenin gosterecegi adres
 * @param lLeft [long][in]: Pencerenin sagdan konumu
 * @param lTop [long][in]: Pencerenin ustten konumu
 * @param lWidth [long][in]: Pencerenin genisligi
 * @param lHeight [long][in]: Pencerenin yuksekligi
 *
 * @return void
 */
function showModalDialog(winParent, strCaption, strURL, lLeft, lTop, lWidth, lHeight) {
    initializeModalDialog(winParent);
    
    divModalDialog = createModalDialog(strCaption, strURL, lLeft, lTop, lWidth, lHeight);
    
    divModalDialog.style.display = "block";
}

/**
 * showModalDialog - Modal formunda bir form gosterir.
 *
 * @param strURL: Pencerenin gosterecegi adres
 * @param lLeft: Pencerenin sagdan konumu
 * @param lTop: Pencerenin ustten konumu
 * @param lWidth: Pencerenin genisligi
 * @param lHeight: Pencerenin yuksekligi
 *
 * @return void
 */
function closeModalDialog() {
    destroyModalDialog();
    finalizeModalDialog();
}

/**
 * refreshCurrentModalDialog - Mevcut modal
 * dialog u yeniler
 *
 * @return void
 */
function refreshCurrentModalDialog(strCallbackFunctionName) {
	// Mevcut formu yenile
    ifrModalFrame
			= document.getElementById("ifrFrame" + glCurrentZIndex);

	if (ifrModalFrame) {
		if (strCallbackFunctionName != "") {
			eval("ifrModalFrame.contentWindow."
					+ strCallbackFunctionName);
		} else {
			ifrModalFrame.contentWindow.history.go(0);
			ifrModalFrame.contentWindow.focus();
		}
	} else {
		if (strCallbackFunctionName != "") {
			eval("window." + strCallbackFunctionName);
		} else {
			window.history.go(0);
			window.focus();
		}
	}
}