// Rich HTML Balloon Tooltip: http://www.dynamicdrive.com/dynamicindex5/balloontooltip.htm
// Created: September 10th, 2006
// Modified by Simon Plenderleith (NSTW Design) - 10/18/06

var disappeardelay  = 500;      //tooltip disappear delay (in miliseconds)

var verticaloffset  = 0;        //vertical offset of tooltip from anchor link, if any
var enablearrowhead = 1;        //0 or 1, to disable or enable the arrow image
var arrowheadimg    = ["/images/balloon_tooltip/arrowdown.gif", "/images/balloon_tooltip/arrowup.gif"];     //path to down and up arrow images
var arrowheadheight = 11;       //height of arrow image (amount to reveal)

// ----------------------------------------------------------------------------------

// Preload images
var balloon_images  = new Array();
for(var x = 0; x < arrowheadimg.length; x++){
    balloon_images[x]       = new Image();
    balloon_images[x].src   = arrowheadimg[0];
}

// ----------------------------------------------------------------------------------

var ie          = document.all
var ns6         = document.getElementById && !document.all;
verticaloffset  = (enablearrowhead)? verticaloffset+arrowheadheight : verticaloffset;

function getposOffset(what, offsettype){
    
    var totaloffset = (offsettype=="left")? what.offsetLeft : what.offsetTop;
    var parentEl    = what.offsetParent;
    
    while (parentEl!=null){
        totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
        parentEl=parentEl.offsetParent;
    }
    
    return totaloffset;
    
}

function showhide(obj, e){
    dropmenuobj.style.left  = dropmenuobj.style.top = "-500px";
    if (e.type=="mouseover")    obj.visibility = "visible";
}

function iecompattest(){
    return (document.compatMode && document.compatMode!="BackCompat") ? document.documentElement : document.body;
}

function clearbrowseredge(obj, whichedge){
    
    if (whichedge=="rightedge"){
        edgeoffsetx     = 0;
        var windowedge  = ie && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;
        dropmenuobj.contentmeasure  = dropmenuobj.offsetWidth;
        if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)  edgeoffsetx=dropmenuobj.contentmeasure-obj.offsetWidth
        return edgeoffsetx;
    }
    else{
        edgeoffsety     = 0;
        var topedge     = ie && !window.opera? iecompattest().scrollTop : window.pageYOffset;
        var windowedge  = ie && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
        dropmenuobj.contentmeasure  = dropmenuobj.offsetHeight;
        if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure)  edgeoffsety=dropmenuobj.contentmeasure+obj.offsetHeight+(verticaloffset*2);
        return edgeoffsety;
    }
    
}

function displayballoontip(obj, e){ //main ballooon tooltip function

    if (typeof dropmenuobj != "undefined")    dropmenuobj.style.visibility="hidden";
    clearhidemenu();
    
    dropmenuobj = document.getElementById(obj.className);
    
    if(dropmenuobj){

        showhide(dropmenuobj.style, e);

        dropmenuobj.x           = getposOffset(obj, "left");
        dropmenuobj.y           = getposOffset(obj, "top")+verticaloffset;

        dropmenuobj.style.left  = dropmenuobj.x-clearbrowseredge(obj, "rightedge") + "px";
        dropmenuobj.style.top   = dropmenuobj.y-clearbrowseredge(obj, "bottomedge") + obj.offsetHeight + "px";

        if (enablearrowhead)    displaytiparrow();
        
    }
    
}

function displaytiparrow(){ //function to display optional arrow image associated with tooltip
    
    tiparrow            = document.getElementById("arrowhead");
    tiparrow.src        = (edgeoffsety!=0)? arrowheadimg[0] : arrowheadimg[1];
    
    var ieshadowwidth   = (dropmenuobj.filters && dropmenuobj.filters[0])? dropmenuobj.filters[0].Strength-1 : 0;
    
    //modify "left" value depending on whether there's no room on right edge of browser to display it, respectively
    tiparrow.style.left = (edgeoffsetx!=0)? parseInt(dropmenuobj.style.left)+dropmenuobj.offsetWidth-tiparrow.offsetWidth-10+"px" : parseInt(dropmenuobj.style.left)+5+"px";
    
    //modify "top" value depending on whether there's no room on right edge of browser to display it, respectively
    tiparrow.style.top  = (edgeoffsety!=0)? parseInt(dropmenuobj.style.top)+dropmenuobj.offsetHeight-tiparrow.offsetHeight-ieshadowwidth+arrowheadheight+"px" : parseInt(dropmenuobj.style.top)-arrowheadheight+"px";
    
    tiparrow.style.visibility   = "visible";
    
}

function delayhidemenu(){
    delayhide = setTimeout("dropmenuobj.style.visibility='hidden'; dropmenuobj.style.left=0; if (enablearrowhead) tiparrow.style.visibility='hidden'",disappeardelay);
}

function clearhidemenu(){
    if (typeof delayhide!="undefined")  clearTimeout(delayhide)
}

function classtoelement(linkobj){ //tests if a link has "class" defined and it's the ID of an element on page
    var classvalue    = linkobj.className;
    return (classvalue != null && classvalue != "" && document.getElementById(classvalue) != null && document.getElementById(classvalue).className=="balloonstyle") ? true : false;
}

function initalizetooltip(){
    
    if (!document.getElementsByTagName) return false;
    
    var all_links   = document.getElementsByTagName("a");
    
    if (enablearrowhead){
        tiparrow    = document.createElement("img");
        tiparrow.setAttribute("src", arrowheadimg[0]);
        tiparrow.setAttribute("id", "arrowhead");
        document.body.appendChild(tiparrow);
    }
    
    for (var i=0; i < all_links.length; i++){
        
        if (classtoelement(all_links[i])){ //if link has "class" defined and it's the ID of an element on page
            
            addEvent(all_links[i], "mouseover", function(e){
                                                    var src_element  = getSrcElement(e);
                                                    if(src_element.tagName=="IMG")  src_element = src_element.parentNode;
                                                    displayballoontip(src_element, e);
                                                });
            
            addEvent(all_links[i], "mouseout", delayhidemenu);
            
        }
    }
    
}

function cancel_event(e){var e=(e || window.event);e.cancelBubble=true;if(typeof e.stopPropagation=='function'){e.stopPropagation();} e.returnValue=false;if(typeof e.preventDefault=='function'){e.preventDefault();}}

addEvent(window, "load", initalizetooltip);
// DOM Ready
jQuery(function(){
    PM_ProductInfo.setEventHandlers();
    PM_ProductInfo.init();
});

var PM_ProductInfo = {
    
    targetImage: "p_image_main",
    thumbClass:  "pi_thumb",
    lrgImagePrefixes: ["lrg", "lg"],
    medImagePrefixes: ["med", "md"],
    originalMedImage: "",
    
    setEventHandlers: function(){
        jQuery(".review-useful,.review-not-useful").click(PM_ProductInfo.rateReview);
        jQuery("#cart_quantity").submit(PM_ProductInfo.checkNoEngravingProof);
        jQuery("input[name='send_photo_type']").click(PM_ProductInfo.displaySendPhotoInstructions);
        jQuery("#uploaded-photo-delete").click(PM_ProductInfo.deleteUploadedPhoto);
    },
    
    init: function(){
         // IE only related JavaScript
    	if(jQuery.browser.msie){
    		// PNG Fix (IE 5.5 and 6)
    		if(jQuery.browser.version >= 5.5 && jQuery.browser.version < 7){
    			// PNG Fix
    			jQuery('img[@src$=.png]').ifixpng('/images/pixel.gif');
    		}
    	}
        var me = PM_ProductInfo;
        // Find thumbnail product images, preload medium images and set event handlers
        jQuery("a[rel^='shadowbox']").filter("." + me.thumbClass).each(function(i){
        	var $anchor = jQuery(this);
            // Preload images
        	me.preloadMedImage($anchor);
            // Attach rollover events
            $anchor.hoverIntent({
                sensitivity: 3,
                interval: 50,
                over: function(){ me.displayMedImage($anchor); },
                timeout: 500,
                out: function(){ me.revertMedImage($anchor); }
            });
        });
        PM_ProductInfo.addToCartLinks();
        PM_ProductInfo.setupCharCounters();
    },
    
    checkNoEngravingProof: function(){
        var selectId = 557, optionId = 1022;
        var $proofSelect = jQuery("#select-" + selectId);
        // Check if engraving proof select exists
        if($proofSelect.length){
            var selectedOption  = $proofSelect.val();
            var pmProductId     = PM_Config.get('PM_PRODUCT_ID');
            // Check selected option is 'No Thanks'
            if(selectedOption==optionId && pmProductId != ''){
                // Check text inputs for engraving text
                var isEngraved = false;
                jQuery("#options input:text").each(function(){
                    if(jQuery(this).val() != ''){
                        isEngraved = true;
                    }
                });
                if(isEngraved){
                    // Display no engraving proof confirmation page
                    Shadowbox.open({
                        content:    "no_engraving_proof.php?ppid=" + pmProductId,
                        player:     "iframe",
                        title:      "No Engraving Example",
                        width:      700,
                        height:     350
                    });
                    return false;
                }
            }
        }
        dbl_click_protect('submitSpan', 'submitSpan1');
        return true;
    },
    
    addToCartLinks: function(){
        var $linkContainers = jQuery("td.buy");
        if($linkContainers.length){
            $linkContainers.each(function(){
                var $container = jQuery(this);
                var quantity   = $container.attr('id').replace(/^qd\-buy\-/, '');
                if(parseInt(quantity, 10)==quantity){
                    $container.html('<a href="#" id="qd-quantity-' + quantity +'" class="qd-add-to-cart">Add to cart</a>');
                }
                jQuery(".qd-add-to-cart").click(PM_ProductInfo.addToCartMultiple);
            });
        }
    },
    
    addToCartMultiple: function(){
        var $link = jQuery(this);
        var quantity = $link.attr('id').replace(/^qd\-quantity\-/, '');
        var $quantityField = jQuery("#products_quantity");
        if(parseInt(quantity, 10)==quantity && $quantityField.length){
            $quantityField.val(quantity);
            jQuery("#cart_quantity").submit();
        }
        return false;
    },
    
    setupCharCounters: function(){
        // Add character counter to any options with a text field
        jQuery("#options ol li :text").each(function(){
            var $me = jQuery(this);
            $me.charCounter($me.attr("maxlength"), { delay: 100 });
            jQuery(this).next("span").width(jQuery(this).width()-5);
        });
        // Setup product option locks
        setTimeout(PM_ProductInfo.initLockedOptions, 1000);
    },
    
    lockedOptionsConfig: [],
    lockedStatus: [],
    lockedTipCreated: [],
    lockedTriggerFields: [],
    lockedTriggerValues: [],
    lockedTargets: [],
    lockedTargetsValues: [],
    
    setLockedOptionsConfig: function(optionId, triggerField, triggerValue, targets){
        PM_ProductInfo.lockedOptionsConfig[PM_ProductInfo.lockedOptionsConfig.length] = {
            optionId: optionId,
            triggerField: triggerField,
            triggerValue: triggerValue,
            targets: targets
        };
    },
    
    initLockedOptions: function(){
        var config;
        for(var n = 0; n < PM_ProductInfo.lockedOptionsConfig.length; n++){
            config = PM_ProductInfo.lockedOptionsConfig[n];
            PM_ProductInfo.setupLockedOptions(config.optionId, config.triggerField, config.triggerValue, config.targets);
        }
    },
    
    setupLockedOptions: function(optionId, triggerField, triggerValue, targets){
        var $triggerField = jQuery("#" + triggerField);
        var targetsSelector = "#" + targets.join(",#");
        var $targets = jQuery(targetsSelector);
        // Check trigger field and target fields exist
        if($triggerField.length && $targets.length){
            PM_ProductInfo.lockedTriggerFields[optionId]   = $triggerField;
            PM_ProductInfo.lockedTriggerValues[optionId]   = triggerValue;
            PM_ProductInfo.lockedTargets[optionId]         = $targets;
            // Check if target fields should be disabled
            if(PM_ProductInfo.lockedTriggerFields[optionId].val()==PM_ProductInfo.lockedTriggerValues[optionId]){
                // Disable target fields
                PM_ProductInfo.lockTargetOptions(optionId);
            }
            // Check trigger field when value changes
            PM_ProductInfo.lockedTriggerFields[optionId].change(function(){
                var currentTriggerFieldValue = jQuery(this).val();
                if(currentTriggerFieldValue==PM_ProductInfo.lockedTriggerValues[optionId]){
                    // Disable target fields
                    PM_ProductInfo.lockTargetOptions(optionId);
                }
                else{
                    // Enable target fields
                    PM_ProductInfo.unlockTargetOptions(optionId);
                }
            });
        }
    },
    
    lockTargetOptions: function(optionId){
        if(PM_ProductInfo.lockedTargets[optionId] && !PM_ProductInfo.lockedStatus[optionId]){
            // Disable target fields
            PM_ProductInfo.lockedTargets[optionId].attr("disabled", "disabled").addClass("disabled-option");
            PM_ProductInfo.lockedStatus[optionId] = true;
            // Loop through targets and store values
            PM_ProductInfo.lockedTargetsValues[optionId] = [];
            PM_ProductInfo.lockedTargets[optionId].each(function(){
                var $target = jQuery(this);
                var targetId = $target.attr("id");
                var targetType = this.tagName.toLowerCase();
                if(targetType=="select"){
                    var targetValue = this.selectedIndex;
                    // Reset target value
                    this.selectedIndex = 0;
                }
                else{
                    var targetValue = $target.val();
                    // Reset target value
                    $target.val('');
                }
                // Store target type and value
                PM_ProductInfo.lockedTargetsValues[optionId][targetId] = { targetType: targetType, targetValue: targetValue };
            });
            // Display trigger field tip
            PM_ProductInfo.displayTriggerFieldTip(optionId);
        }
    },
    
    unlockTargetOptions: function(optionId){
        if(PM_ProductInfo.lockedTargets[optionId] && PM_ProductInfo.lockedStatus[optionId]){
            // Enable target fields
            PM_ProductInfo.lockedTargets[optionId].removeAttr("disabled").removeClass("disabled-option");
            PM_ProductInfo.lockedStatus[optionId] = false;
            // Loop through targets and set values
            PM_ProductInfo.lockedTargets[optionId].each(function(){
                var $target = jQuery(this);
                var targetId = $target.attr("id");
                if(PM_ProductInfo.lockedTargetsValues[optionId][targetId]){
                    // Check target type
                    if(PM_ProductInfo.lockedTargetsValues[optionId][targetId].targetType=="select"){
                        // Set target value
                        this.selectedIndex = PM_ProductInfo.lockedTargetsValues[optionId][targetId].targetValue;
                    }
                    else{
                        // Set target value
                        $target.val(PM_ProductInfo.lockedTargetsValues[optionId][targetId].targetValue);
                    }
                }
            });
            // Hide trigger field tip
            PM_ProductInfo.hideTriggerFieldTip(optionId);
        }
    },
    
    displayTriggerFieldTip: function(optionId){
        if(PM_ProductInfo.lockedTriggerFields[optionId]){
            var triggerId   = PM_ProductInfo.lockedTriggerFields[optionId].attr("id");
            var tipId       = triggerId + "-tip";
            // Check if tip needs creating
            if(!PM_ProductInfo.lockedTipCreated[optionId]){
                var $triggerLabel = PM_ProductInfo.lockedTriggerFields[optionId].prev("label");
                // Check trigger label exists
                if($triggerLabel.length){
                    var triggerLabelValue = $triggerLabel.html();
                    // Get trigger position
                    var triggerOffset = PM_ProductInfo.lockedTriggerFields[optionId].offset();
                    // Create tip
                    var tipTop  = (triggerOffset.top + PM_ProductInfo.lockedTriggerFields[optionId].height() + 10);
                    var tipLeft = (triggerOffset.left + 10);
                    var tipCss  = 'top: ' + tipTop + 'px; left:  ' + tipLeft + 'px;';
                    var tipHtml = '<div id="' + tipId + '" style="' + tipCss + '" class="locked-trigger-tip">Please select \'' + triggerLabelValue + '\' first</div>';
                    // Add tip to the page
                    PM_ProductInfo.lockedTriggerFields[optionId].after(tipHtml);
                    PM_ProductInfo.lockedTipCreated[optionId] = true;
                }
            }
            // Show tip if already created
            else{
                jQuery("#" + tipId).show();
            }
        }
    },
    
    hideTriggerFieldTip: function(optionId){
        if(PM_ProductInfo.lockedTriggerFields[optionId]){
            var triggerId   = PM_ProductInfo.lockedTriggerFields[optionId].attr("id");
            var tipId       = triggerId + "-tip";
            jQuery("#" + tipId).hide();
        }
    },
    
    // Preloads a medium image
    preloadMedImage: function($srcAnchor){
        var me = PM_ProductInfo;
        if(me.originalMedImage==""){
            var $targetImageRef      = jQuery("#" + me.targetImage);
            me.originalMedImage    = $targetImageRef.attr("src");
        }
        var srcHref = $srcAnchor.attr("href");
    	if(srcHref && srcHref != ""){
    		var imagePath		= me.getMedImagePath(srcHref);
    		var preloadedImage	= new Image();
    		preloadedImage.src	= imagePath;
    	}
    },

    // Displays a medium image in place of the main medium image when a thumb is rolled over
    displayMedImage: function($srcAnchor){
        var me = PM_ProductInfo;
    	var $targetImageRef  = jQuery("#" + me.targetImage);
    	var srcHref = $srcAnchor.attr("href");
    	if($targetImageRef.length && srcHref && srcHref != ""){
    		var imagePath		= me.getMedImagePath(srcHref);
    		var preloadedImage	= new Image();
    		preloadedImage.onload	= function(){
    			$targetImageRef.attr("src", preloadedImage.src);
    		};
    		preloadedImage.src = imagePath;
    	}
    },

    // Reverts the main medium image back to the original
    revertMedImage: function($srcAnchor){
        var me = PM_ProductInfo;
    	var $targetImageRef  = jQuery("#" + me.targetImage);
    	if($targetImageRef.length && me.originalMedImage != ""){
    	    var srcHref = $srcAnchor.attr("href");
    		if($targetImageRef.attr("src") != me.getMedImagePath(srcHref)){
    		    return false;
    		}
    		$targetImageRef.attr("src", me.originalMedImage);
    	}
    },

    // Constructs a medium image path from a large image path
    getMedImagePath: function(lrgImagePath){
        var me = PM_ProductInfo;
    	var lrgRegex;
    	var imagePath	= lrgImagePath;
    	for(var i = 0; i < me.lrgImagePrefixes.length; i++){
    		lrgRegex		= new RegExp(me.lrgImagePrefixes[i], "i");
    		imagePath		= imagePath.replace(lrgRegex, me.medImagePrefixes[i]);
    	}
    	return imagePath;
    },
    
    rateReview: function(){
        // Remove link focus
        this.blur();
        
        var data  = {};
        
        var $elmt = jQuery(this);
        
        if($elmt.is(".review-useful")){
            data.is_useful = 1;
        }
        else if($elmt.is(".review-not-useful")){
            data.is_useful = 0;
        }
        
        var $ratingContainer = $elmt.parents(".review-helpful");
        var $buttonsWrapper  = $ratingContainer.children(".buttons-wrapper");
        
        // Get review ID
        var containerIdParts = $ratingContainer.attr("id").split("-");
        var reviewId         = containerIdParts[containerIdParts.length - 1];
        
        data.review_id = reviewId;
        
        // Update action status
        $buttonsWrapper.html("Submitting...");
        
        // Submit rating
        jQuery.ajax({
            "type": "POST",
            "url": "/helpers/review_rating.php",
            "data": data,
            "dataType": "text",
            "cache": false,
            "complete": function(XMLHttpRequest, textStatus){
                $buttonsWrapper.html("Thank you for your feedback.");
            }
        });
        
        return false;
        
    },
    
    displaySendPhotoInstructions: function(){
        var $elmt = jQuery(this);
        var sendType = $elmt.val();
        if(sendType != ''){
            jQuery(".send-photo-option.selected").removeClass("selected");
            jQuery(".send-photo-instructions").hide();
            $elmt.parent(".send-photo-option").addClass("selected");
            jQuery("#send-photo-instructions-" + sendType).show();
        }
    },
    
    deleteUploadedPhoto: function(){
        this.blur();
        var filename = jQuery("#send_photo_filename").val();
        if(filename != ""){
            jQuery.ajax({
                url: "/helpers/engraving_photo_delete.php",
                type: "POST",
                data: { filename: filename },
                complete: function(XMLHttpRequest, textStatus){
                    jQuery("#send_photo_filename").val('');
                    jQuery("#send_photo_cropping_notes").val('');
                    jQuery("#uploaded-photo").removeClass('expanded');
                    jQuery("#divFileProgress").hide();
                }
            });
        }
        return false;
    }
    
};
