﻿/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace('PNI');
 
function OpenHelpPanel(page) {
	var w = 820;
	var h = 735;
	var winl = (screen.width-w)/2;
	var wint = (screen.height-h)/2;
	var settings ='height='+h+',';
	var p = RootUrl + 'help/';
	settings +='width='+w+',';
	settings +='top='+wint+',';
	settings +='left='+winl+',';
	settings +='scrollbars=no,';
	settings +='resizable=no';
	childWindow=window.open(p+page,'help',settings);
	childWindow.window.focus();			
}

function createRadioButton(parent, id, name, checked, onclick) 
{
    if (checked == null) checked = false;
    
    if (BrowserIsIE())
    {
        // For Internet Explorer
        var sChecked = '';
        if (checked) sChecked = " checked ";
        var onclickjs = '';
        if (onclick != null && onclick.length > 0) onclickjs = ' onclick = "' + onclick + '" ';
        var elem = document.createElement('<input type="radio" name="'+name+'" id="'+id+'" '+ sChecked + onclickjs + ' />');
        parent.appendChild(elem);
        return elem; 
    }
    else
    {
        // All other browsers
        var rdo = document.createElement('input');
        rdo.setAttribute('type','radio');
        rdo.setAttribute('name',name);
        rdo.setAttribute('id',id);
        if (checked) rdo.setAttribute('checked', true);
        if (onclick != null && onclick.length > 0) rdo.setAttribute('onClick', onclick);
        parent.appendChild(rdo);
        return rdo;
    }
}

// can be used to call multiple functions upon page load
function addLoadEvent(func) 
{   
  var oldonload = window.onload;   
  if (typeof window.onload != 'function') {   
    window.onload = func;   
  } else {   
    window.onload = function() {   
      if (oldonload) {   
        oldonload();   
      }   
       func();   
     }   
   }   
}   

//*************************************
//* Web Service / PageMethod callbacks
//*************************************
function gotError(error, ctx, methodName) {
    if (hideBusyPopup){
        hideBusyPopup();
    }
    if (error) {
        //var errMsg = error.get_message();
        //var stkTrace = error.get_stackTrace();
        //var errType = error.get_exceptionType(); 
        var errStatus = error.get_statusCode();              
        //var errTimedOut = error.get_timedOut();
        // IE http://support.microsoft.com/default.aspx?scid=kb;EN-US;193625
        switch (errStatus) {
            case 12002: // IE The request has timed out.
            {
                // ignore                
                break;
            }       
            case 12030: // IE The connection with the server has been terminated.
            case 12031: // IE The connection with the server has been reset.            
            case 401:   // HTTP 401 Unauthorized
            {
                alert("Authentication Failed. Please click OK to proceed to login page.");
                document.location = RootUrl;
                break;
            }
            default:
            {     
                var nl = "\r\n";
                var message =   
                "Method Name: " + methodName +nl+nl+             
                "Status Code: " + error.get_statusCode() +nl+nl+
                "Error: " + error.get_message() +nl+nl+
                "Exception Type: " + error.get_exceptionType() +nl+nl+
                "Stack Trace: " + error.get_stackTrace() + nl;
                
                if (typeof masterService != 'undefined')
                    masterService.LogError(message, Redirect, gotError);
                else
                    document.location = RootUrl+"error.aspx";
                
                //alert(message);       
                //alert('{"Message":"'+errMsg+'","StackTrace":"'+stkTrace+'","ExceptionType":"'+errType+'","MethodName":"'+methodName+'","StatusCode":"'+errStatus+'","TimeOut":"'+errTimedOut+'"}'); 
                //document.location = RootUrl+"error.aspx";
                break;
            }
        }                
    }
} 
function gotSuccess(result) { // dummy callback function for service call that doesn't need to do anything on success. We need this so we can utilize the error callback function.
}

function Redirect(result) {
    if (result) {
        location.href=RootUrl+result;
    }
}


//************************
//* START IMAGE PRELOADER
//************************


function ImagePreloader()
{
    if (this.Images == null)
    {
        // initialize internal state.
        this.LoadedCount = 0;
        this.ImageCount = 0;
        this.ErrorCount = 0;
        this.Images = new Array;  
        if (typeof(RootUrl) != 'undefined')  
            this.DefaultLoadingImage = RootUrl + "images/loading.gif";
        else
            this.DefaultLoadingImage = "../images/loading.gif";
            
        this.defaultImageWidth = 16;
        this.defaultImageHeight = 16;
    }    
}

ImagePreloader.prototype = {
    Images: null,
    DefaultLoadingImage: null,
    ErrorCount: null,
    ImageCount: null,
    LoadedCount: null,
    defaultImageWidth: null,
    defaultImageHeight: null,

    Preload: function(imageUrl, imageElementId, altText, onLoadCallback) {
        // create new Image object and add to array
        var oImage = new Image;
        oImage.elementId = imageElementId;
        oImage.alt = altText;

        oImage.onLoadCallback = onLoadCallback;
        oImage.callbackCalled = false;

        // assign pointer back to this.
        oImage.oImagePreloader = this;
        oImage.bLoaded = false;

        this.Images.push(oImage);
        this.ImageCount = this.Images.length;

        this.SetPreloaderImageToElement(imageElementId, altText);

        // set up event handlers for the Image object
        oImage.onload = ImagePreloader.prototype.onload;
        oImage.onerror = ImagePreloader.prototype.onerror;
        oImage.onabort = ImagePreloader.prototype.onabort;

        oImage.src = imageUrl;
        //if the image is already loaded, then display it now
        //(because in that case the event handler may never fire)
        //if (oImage.complete) oImage.onload();

        return oImage;
    },

    SetPreloaderImageToElement: function(imageElementId, altText) {
        var el = document.getElementById(imageElementId);
        if (el == null) el = new Image;
        if (el.src != this.DefaultLoadingImage) el.src = this.DefaultLoadingImage;
        el.alt = "loading " + unescape(altText) + "...";
        el.width = this.defaultImageWidth;
        el.height = this.defaultImageHeight;
        el.style.height = this.defaultImageHeight + 'px';
        el.style.width = this.defaultImageWidth + 'px';
        el.setAttribute("style", "height:" + this.defaultImageHeight + "px; width:" + this.defaultImageWidth + "px;");
    },
    //-------------------------------------------------------------
    //Image Object Context functions
    //These functions will be attached to the image object's events.
    onload: function() {
        //This function is running on the image context not the imagePreloader object context.
        //Need the reference this.oImagePreloader to point to the Global ImagePreloader.
        this.bLoaded = true;
        this.oImagePreloader.LoadedCount++;
        var img = document.getElementById(this.elementId);
        img.src = this.src;
        img.alt = this.alt;
        img.width = this.width;
        img.height = this.height;
        img.style.width = this.width + 'px';
        img.style.height = this.height + 'px';
        img.setAttribute("style", "height:" + this.height + "px; width:" + this.width + "px;");

        if (typeof (this.onLoadCallback) !== 'undefined' && this.onLoadCallback != null && !this.callbackCalled) {
            this.onLoadCallback(img);
            this.callbackCalled = true;
        }
    },
    onerror: function() {
        this.oImagePreloader.ErrorCount++;
        this.bError = true;
        this.bLoaded = true;
        this.oImagePreloader.LoadedCount++;
        var img = document.getElementById(this.elementId);
        img.src = RootUrl + "images/missing.jpg";
        img.alt = "missing image: " + this.src;
    },
    onabort: function() {
        this.oImagePreloader.ErrorCount++;
        this.bAbort = true;
        this.bLoaded = true;
        this.oImagePreloader.LoadedCount++;
        var img = document.getElementById(this.elementId);
        img.src = RootUrl + "images/missing.jpg";
        img.alt = "missing image: " + this.src;
    }
    //End of Image Context functions
    //-------------------------------------------------------------       
};


var ImageLoader = new ImagePreloader();

//************************
//* END IMAGE PRELOADER
//************************

// general for underlining on hover for an object
function Underline(object, yes)
{
    if (yes)
        object.style.textDecoration = "underline";
    else
        object.style.textDecoration = "none";     
}

function QueryString( name )
{  
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
    var regexS = "[\\?&]"+name+"=([^&#]*)";  
    var regex = new RegExp( regexS );  
    var results = regex.exec( window.location.href );  
    if( results == null )    return "";  else    return results[1];
}

function BrowserIsFirefox()
{
    return (navigator.userAgent.indexOf("Firefox")!=-1);
}

function BrowserIsFirefox2()
{
    // source: http://www.javascriptkit.com/javatutors/navigator.shtml
    if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent))
    { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
        var ffversion=new Number(RegExp.$1) // capture x.x portion and store as a number
        if (ffversion>=3)
            return false;
        else
            return true;
    }
    return false;
}

function BrowserIsFirefox3()
{
    // source: http://www.javascriptkit.com/javatutors/navigator.shtml
    if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent))
    { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
        var ffversion=new Number(RegExp.$1) // capture x.x portion and store as a number
        if (ffversion>=3)
            return true;
        else
            return false;
    }
    return false;
}

function OSIsVista()
{
    if (navigator.userAgent.indexOf("windows NT 6.0") > -1)
        return true;
    else
        return false;
}

function OSIsWindowsSeven() 
{
    if (navigator.userAgent.indexOf("windows NT 7.0") > -1)
        return true;
    else
        return false;
}

function BrowserIsSafari()
{
    return (navigator.userAgent.indexOf("Safari")!=-1);
}

function BrowserIsIE()
{
    return (navigator.appVersion.indexOf("MSIE")!=-1);
}

function BrowserIsIE6()
{
    var isIE6 = false;
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) //test for MSIE x.x;
    { 
        var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
        
        if ((ieversion>=6) && (ieversion<7))
            isIE6 = true;
    }
    return isIE6;
}

function BrowserIsIE7()
{
    var agent  = navigator.userAgent.toLowerCase();
    var is_ie  = ((agent.indexOf("msie") != -1) && (agent.indexOf("opera") == -1));
    var is_ie7 = (is_ie && agent.indexOf("msie 7.0") != -1);
    return is_ie7;
}

//*********************
// * TEMP MODALPOPUPEXTENDER TEXTBOX FOCUS FIX FOR FIREFOX (Apply globally)
//********************
var MODALPOPUPEXTENDERtxtclientid;
function fnSetFocus(txtClientId)
{
	MODALPOPUPEXTENDERtxtclientid=txtClientId;
	setTimeout("fnFocus()",1000);
    
}

function fnFocus()
{
    eval("document.getElementById('"+MODALPOPUPEXTENDERtxtclientid+"').focus()");
}

//*************************
//Image edit helper methods
//*************************

// Rectangle can be passed around as Dimension and Point also (duck typing)
function Rectangle(x, y, w, h) {
	this.x = isNaN(x)?0:x;
	this.y = isNaN(y)?0:y;
	this.w = isNaN(w)?0:w;
	this.h = isNaN(h)?0:h;
}
function Dimension(w, h) {
	this.w = isNaN(w)?0:w;
	this.h = isNaN(h)?0:h;
}
function Point(x, y) {
	this.x = isNaN(x)?0:x;
	this.y = isNaN(y)?0:y;
}
function getSize(element) {
	return new Dimension(element.width, element.height);
}

function setLeft(o,v)	{if(o)o.style.left=v+"px";}
function setTop(o,v)	{if(o)o.style.top=v+"px";}

function getLeft(o)		{if(!o||(!o.style.left))  return 0; return parseInt(o.style.left.replace("px",""));}
function getTop(o)		{if(!o||(!o.style.top))  return 0; return parseInt(o.style.top.replace("px",""));}
function getWidth(o)	{if(!o||(!o.style.width)) return 0; return parseInt(o.style.width.replace("px",""));}
function getHeight(o)	{if(!o||(!o.style.height))return 0; return parseInt(o.style.height.replace("px",""));}
function getPosition(o) {return new Point( getLeft(o), getTop(o));}

// Returns a new Dimension scaled as requested
function scale(originalDim, requestedDim, crop) {
	if(!requestedDim && originalDim) return originalDim;
	var outAspect = requestedDim.w / requestedDim.h;
	var imgAspect = originalDim.w / originalDim.h;
	if (imgAspect < outAspect == crop) {
		// Scale to max width
		return new Dimension(requestedDim.w, requestedDim.w / imgAspect);
	}
	else {
		// Scale to max height
		return new Dimension(requestedDim.h * imgAspect, requestedDim.h);
	}
}

function resize(element, w, h) {
	element.style.width = w + 'px';
	element.style.height = h + 'px';
}

function move(element, x, y) {
	element.style.top = '' + y + 'px';
	element.style.left = '' + x + 'px';
}


function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var temp = new obj.constructor(); // changed (twice)
    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}   

/* mmmmm, cookie functions */
/* http://www.quirksmode.org/js/cookies.html */
/* http://tastegoblet.files.wordpress.com/2007/10/doggie-cookies.jpg */

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	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);
}

//
// Popup related
//

function ShowPopupComingSoon()
{
    ShowPopUp(PopupComingSoonID);
}

function ShowPopupHelpRequest() 
{
    HideUploader();
	    
    ShowPopUp(PopUpHelpRequestID);
}
    
function ShowPopUpSharePanel()
{
    ShowPopUp(PopUpShareMediaID);
}

function ShowPopUp(popupID)
{
    if (popupID)
    {
        var popup = $find(popupID);
        if (popup) {
            popup._foregroundElement.style.zIndex = 100003;
            popup.show();
        }
    }
}

function HidePopUp(popupID)
{
    if (popupID)
    {
        var popup = $find(popupID);
        if (popup)
        {
            popup.hide();
        }
    }
}

function ShowLoginPopUp(popupID, returnURL) 
{
    var giftFlowReturnURLOBJ = $get(giftFlowReturnURLOBJID);
    if (giftFlowReturnURLOBJ != null)
        giftFlowReturnURLOBJ.value = returnURL;
    ShowPopUp(popupID);
}

function closeHelpFormPopup() 
{
    ReShowUploader();
    var pageURL = location.href;

    if (pageURL.indexOf("help") != -1)
        helpCancel();
}

function showOKPopup(title, message)
{
    var LiteralHeader=$get("literal_header_okpopup");
    LiteralHeader.innerHTML = title;
    var LiteralMsg=$get("message_okpopup");
    LiteralMsg.innerHTML = message;

    ShowPopUp(OKPopUpPanelID);
}

function showContinueCancelPopup(title, message, cancelImageURL)
{
    var LiteralHeader=$get("literal_header_continuecancel");
    LiteralHeader.innerHTML = title;
    var LiteralMsg=$get("message_continuecancel");
    LiteralMsg.innerHTML = message;
    if (cancelImageURL != null)
    {
        var cancelImageButton = $get(btnCancelContinueCancelPopUpID);
        cancelImageButton.src = cancelImageURL;
    }
    ShowPopUp(ContinueCancelPopUpPanelID);
}

function showDoubleActionPopup(title, message, cancelImageURL, action1ImageURL, action2ImageURL, action1Function, action2Function)
{
    // set popup text
    var LiteralHeader=$get("literal_header_doubleaction");
    LiteralHeader.innerHTML = title;
    var LiteralMsg=$get("message_doubleaction");
    LiteralMsg.innerHTML = message;
    LiteralMsg.style.textAlign = "center";
    
    // fetch buttons
    var cancelImageButton = $get("btnCancelDoubleAction");
    var action1ImageButton = $get("btnAction1DoubleAction");
    var action2ImageButton = $get("btnAction2DoubleAction");
    
    // set the 3 button imageURLs
    if (cancelImageURL != null)
        cancelImageButton.src = cancelImageURL;
    else
        cancelImageButton.style.display = 'none';
    
    if (action1ImageURL != null)
        action1ImageButton.src = action1ImageURL;
    
    if (action2ImageURL != null)
        action2ImageButton.src = action2ImageURL;
    
    // set action button functions
    action1ImageButton.onclick = function(){action1Function()};
    action2ImageButton.onclick = function(){action2Function()};
    
    // show popup
    ShowPopUp(DoubleActionPopUpPanelID);
}

function ReShowUploader()
{
    var uploader = document.getElementById("Uploader");
    if (uploader)
        uploader.style.display = "block"
    var emptyUploader = document.getElementById("emptyUploader");
    if (emptyUploader)
        emptyUploader.style.display = "none"
}

function HideUploader() 
{
    var uploader = document.getElementById("Uploader");
    if (uploader)
        uploader.style.display = "none"
    var emptyUploader = document.getElementById("emptyUploader");
    if (emptyUploader)
        emptyUploader.style.display = "block"
}

function closePrintProfilePopup(PopUpURL, PopUpTitle)
{
    var popup = $find(PopUpPrintProfileRequestID);
    popup.hide();
    ReShowUploader();
    window.open(PopUpURL, PopUpTitle);
}

function getViewportHeight()
{
    var viewportwidth;
    
    if (typeof window.innerWidth != 'undefined')
    {
        viewportheight = window.innerHeight;
    }
    else if (typeof document.documentElement != 'undefined'
     && typeof document.documentElement.clientWidth !=
     'undefined' && document.documentElement.clientWidth != 0)
    {
        viewportheight = document.documentElement.clientHeight
    }
    else
    {
        viewportheight = document.getElementsByTagName('body')[0].clientHeight
    }
    
    return viewportheight;
}

function validateKeyPress(e, maxLength) {
    var domEvent = new Sys.UI.DomEvent(e);
    // Hack to accomodate Firefox inconsistencies with the keyCode
    if (Sys.Browser.agent == Sys.Browser.Firefox && e.keyCode && (e.keyCode === 46)) {
        domEvent.keyCode = 127;
    } else {
        domEvent.keyCode = e.keyCode;
    }
    
    var textarea = domEvent.target;
    var charCode = domEvent.charCode;
    var textareaValue = textarea.value;		
    // Hack to accomodate IE inconsistencies with whitespace
    textareaValue = textareaValue.replace(/\r\n/g, '\n');
    var actualLength = textareaValue.length;

    if (actualLength >= maxLength) {
        switch(domEvent.keyCode) {
            case Sys.UI.Key.backspace:
            case Sys.UI.Key.tab:
            case Sys.UI.Key.esc:
            case Sys.UI.Key.pageUp:
            case Sys.UI.Key.pageDown:
            case Sys.UI.Key.end:
            case Sys.UI.Key.home:
            case Sys.UI.Key.left:
            case Sys.UI.Key.up:
            case Sys.UI.Key.right:
            case Sys.UI.Key.down:
            case Sys.UI.Key.del:
                return true;
            case Sys.UI.Key.enter:
            case Sys.UI.Key.space:
                return false;
            default: {
                // Handle highlight/replace operations
                if (document.selection) {
                    var range = document.selection.createRange();
                    var rangeElement = range.parentElement();
                    if (rangeElement == textarea) {
                        if (range.text.length > 0) {
                            return true;
                        }
                    }
                } else if (textarea.selectionStart < textarea.selectionEnd) {
                    return true;
                }
            }
        }
        // Hack to accomodate Safari inconsistencies with the keyCode
        if (domEvent.keyCode == 0 && domEvent.charCode == 0) {
            return true;
        }
        return false;
    }
    return true;
}

function GoToDefault(e,encAlbumid)
{
    var target = e.target != null ? e.target : e.srcElement;
    if ( (target.className != 'photo_menu_img') && (target.className != 'yuimenuitemlabel') ){
        location.href=("/album/photos_view.aspx?q="+encAlbumid); 
    }   
}

function enableRoomCodeTextBox(checked)
{
    var RoomCodeTextBox = document.getElementById(RoomCodeTextBoxID);
    var RoomCodeValidator = document.getElementById(RoomCodeValidatorID);
    
    if (checked)
    {
        RoomCodeTextBox.disabled = false;
        RoomCodeTextBox.style.backgroundColor = "";
        EnableRoomCodeValidator(true);
    }
    else
    {
        RoomCodeTextBox.disabled = true;
        RoomCodeTextBox.style.backgroundColor = "rgb(235, 235, 228)";
        EnableRoomCodeValidator(false);
    }
}

function EnableRoomCodeValidator(enable)
{
    for(i=0; i < Page_Validators.length; i++)
    {
        if (Page_Validators[i].id == RoomCodeValidatorID)
        {
            ValidatorEnable(Page_Validators[i], enable);
        }
    }
}

function DisableAddToCartLink(disable) {
    var addtoCartLink = $get('addtoCartLink');

    if (disable) // already in the cart so disable
    {
        addtoCartLink.style.color = "gray";
        addtoCartLink.style.cursor = "default";
        addtoCartLink.style.fontWeight = "normal";
        addtoCartLink.href = "#";
        addtoCartLink.innerHTML = "Added<br /> to Cart";
    }
    else // not in cart so enable
    {
        addtoCartLink.style.color = "#0061aa";
        addtoCartLink.style.cursor = "pointer";
        addtoCartLink.style.fontWeight = "bold";
        addtoCartLink.href = "javascript:AddToCart();";
        addtoCartLink.innerHTML = "Add<br /> to Cart";
    }
}

function UpdateCartItemLabel(count) 
{
    var cartItemCountLabel = getElementsByClassName("class_lblCartItems")[0];
    if (cartItemCountLabel == null)
        cartItemCountLabel = getElementsByClassName("class_lblNoCartItems")[0];

    var cartImage = getElementsByClassName("class_icon_cart")[0];

    var shoppingCartIcon = getElementsByClassName("shopping_cart_icon")[0];
    if (shoppingCartIcon == null)
        shoppingCartIcon = getElementsByClassName("shopping_cart_icon_empty")[0];
    var shoppingCartText = getElementsByClassName("shopping_cart_text")[0];
    if (shoppingCartText == null)
        shoppingCartText = getElementsByClassName("shopping_cart_text_empty")[0];

    var viewCartLink = getElementsByClassName("class_hlCart")[0]; 
    
    cartImage.src = "../images/icon_cart.gif";
    shoppingCartIcon.className = "shopping_cart_icon";
    shoppingCartText.className = "shopping_cart_text";

    if (!viewCartLink) 
    {
        viewCartLink = document.createElement('a');
        viewCartLink.id = 'CartLink';
        viewCartLink.className = 'class_hlCart';
        viewCartLink.href = '../cart/';
        viewCartLink.innerHTML = 'view cart';
        shoppingCartText.appendChild(viewCartLink);
    }
    
    if (count == 0) 
    {
        shoppingCartIcon.className = "shopping_cart_icon_empty";
        shoppingCartText.className = "shopping_cart_text_empty";
        cartItemCountLabel.innerHTML = "Your cart<br />is empty";
        cartImage.src = "../images/icon_cart_empty.gif";

        if (viewCartLink)
            viewCartLink.innerHTML = "";
    }
    else if (count == 1)
        cartItemCountLabel.innerHTML = "You have " + count + " item<br />in your cart<br />";
    else
        cartItemCountLabel.innerHTML = "You have " + count + " items<br />in your cart<br />";
}

var __CaretOffsetBeforeKeyDown = -1;
function enforceTextRestrictionsFF(obj, e) {
    var textLength = obj.value.length;
    if (e.keyCode == 13) // carriage return
    	return false;
    else if ((textLength > maxCharLimit - 1) && (e.keyCode != 8) && (e.keyCode != 46) && (!(e.keyCode >= 36 && e.keyCode <= 41))) // char limit reached and backspace/delete/arrow keys are not the keys that are pressed
    	return false;
    else if ((e.charCode == 60) || (e.charCode == 62)) // disallow HTML script tags < >
    	return false;
    else if (checkSpaceRestriction(e.charCode, obj))
    	return false;
    //        else if ((e.ctrlKey) && (e.charCode == 118)) // disallow paste (HTML scripting protection)
    //            return false;
    else {
    	__CaretOffsetBeforeKeyDown = obj.value.length - getCaretPosition(obj);
    	return true;
    }
}

function enforceTextRestrictionsIE(e) {
	var textLength = this.value.length;
    if (e.keyCode == 13) // carriage return
    	return false;
    else if ((textLength > maxCharLimit - 1) && (e.keyCode != 8) && (e.keyCode != 127) && (!(e.keyCode >= 35 && e.keyCode <= 40))) // char limit reached and backspace/delete/arrow keys are not the keys that are pressed
    	return false;
    else if ((e.shiftKey) && ((e.keyCode == 188) || (e.keyCode == 190))) // disallow HTML script tags < >
    	return false;
    else if (checkSpaceRestriction(e.keyCode, this))
    	return false;
    //        else if ((e.ctrlKey) && (e.keyCode == 86)) // disallow paste (HTML scripting protection)
    //            return false;
    else {
    	__CaretOffsetBeforeKeyDown = this.value.length - getCaretPosition(this);
    	return true;
    }
}

function checkSpaceRestriction(keycode, inputObj) {
	if (keycode == 32) {	// Space
		var caretPos = getCaretPosition(inputObj);
		return (inputObj.value.substring(caretPos - 1, caretPos) == ' ') ||
			   (inputObj.value.substring(caretPos, caretPos + 1) == ' ');
	}
	return false;
}

function getCaretPosition (ctrl) {
	if (ctrl.selectionStart) {
		return ctrl.selectionStart;
	} else if (document.selection) {
		ctrl.focus();
		var r = document.selection.createRange();
		if (r == null)
			return 0;

		var re = ctrl.createTextRange(),
        rc = re.duplicate();
		re.moveToBookmark(r.getBookmark());
		rc.setEndPoint('EndToStart', re);

		return rc.text.length;
	}
	return 0;
}

function setCaretPosition(ctrl, pos) {
	if (ctrl.setSelectionRange) {
		ctrl.focus();
		ctrl.setSelectionRange(pos, pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

function checkPaste(obj) // abide by max char limit and disallow line breaks
{
    var linebreak = /\r\n/g;
    var linebreakString = '\r\n';
    if (BrowserIsFirefox() || BrowserIsSafari()) {
        linebreak = /\n/g;
        linebreakString = '\n'
    }

    if (obj.value.length > maxCharLimit) {
        obj.value = obj.value.substring(0, maxCharLimit).replace(linebreak, ' ');
    }
    else {
        var index = obj.value.indexOf(linebreakString);
        if (index != -1)
            obj.value = obj.value.replace(linebreak, ' ');
    }
}

function AddSeasonSuffixToImagesContainingPartialID(partialID, season_suffix) 
{
    var _seasonsuffix = (season_suffix) ? season_suffix : SeasonSuffix;
    var divs = document.getElementsByTagName("img");
    var len = divs.length;
    var thisDiv, thisDivID;
    for (var i = 0; i < len; i++) 
    {
        thisDiv = divs[i];
        if (thisDiv.id.indexOf(partialID) != -1) 
        {
            var element = $get(thisDiv.id);

            var DefaultImageSrc = element.src;
            
            var imageName = element.src.substring(0, element.src.lastIndexOf('.'));
            var imageExtension = element.src.substring(element.src.lastIndexOf('.'));

            element.onerror = function(path)
            {
                return function()
                {
                    this.onerror = null;
                    this.src = path;
                };
            } (DefaultImageSrc);

            element.onload = function(path) {
                return function() {
                    this.onload = null;
                    this.style.visibility = path;
                };
            } ("visible");

            element.src = imageName + _seasonsuffix + imageExtension;
        }
    }
}

function getPrice(quantity, tieredPriceList, defaultPrice)
{
    var price = defaultPrice;
    for (var i = 0; i < tieredPriceList.length; i++) 
    {
        if (((quantity <= tieredPriceList[i].ToQty.Value) || (tieredPriceList[i].ToQty.Value == -1)) && (quantity >= tieredPriceList[i].FromQty.Value))
        {
            price = tieredPriceList[i].PricePer;
            break;
        }
    }
    
    return price;
}


Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};



function showCanvasSizeScale()
{
    var PopUpPanel = $find(CanvasSizePopUpID);
    PopUpPanel.show();
}

function addCutOffLinkNode(node)
{
    var parentNode = node.parentNode;
    
    var nodeToAdd = document.createElement("a");
    nodeToAdd.setAttribute("href", "javascript:ShowPopUp(HolidayCutOffPopUpPanelID);");
    
    nodeToAdd.appendChild(node);
    parentNode.appendChild(nodeToAdd);
}

function clearElementText(elementID)
{
    var element = $get(elementID);
    if (element)
        element.innerText = '';
}

function floatLeft(elem)
{
    // IE
    elem.style.styleFloat = 'left';
    // FF
    elem.setAttribute("style", "float:left");
}



