﻿var ajaxtarget;
var ajaxcallinprogress = false;
var ajaxcallstack = new Array();

function InsertAjax(url, target, parameters, elementTarget) {
    if (typeof (target) != "function") {
        setLoadingDiv(target);
    }
    else if (elementTarget) 
    {
        setLoadingDiv(elementTarget);
    }
    if (ajaxcallinprogress) {
        ajaxcallstack.push([url, target, parameters]);
        return;
    }
    
    ajaxcallinprogress = true;
    ajaxtarget = target;    
    if (!parameters || parameters.length == 0) {
        NormalAjaxCall(url, target);
    }
    else {
        PostAjaxCall(url, target, parameters);
    }
    if (typeof target != 'function') {
        target.className = '';

        //this will display a message that the item is being added to the cart
        var addingToCartMsgNode = document.getElementById('addingToCart');
        var addedToCartMsgNode = document.getElementById('addedToCart');
        if (addingToCartMsgNode && addedToCartMsgNode) {
            addingToCartMsgNode.style.display = 'none';
            addedToCartMsgNode.style.display = 'block';
        } // if the msg nodes exist
    } // if (typeof target != 'function')
}

function PostAjaxCall(url, target, parameters) {

    xmlhttp = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        xmlhttp = new XMLHttpRequest();
        if (xmlhttp.overrideMimeType) {
            // set type accordingly to anticipated content type
            //xmlhttp.overrideMimeType('text/xml');
            xmlhttp.overrideMimeType('text/html');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) { }
        }
    }
    if (!xmlhttp) {
        alert('Cannot create XMLHTTP instance');
        return false;
    }
    xmlhttp.onreadystatechange = stateChange;
    xmlhttp.open('POST', url, true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    try {
        xmlhttp.setRequestHeader("Content-length", parameters.length);
        xmlhttp.setRequestHeader("Connection", "close");
    }
    catch (Error) { }
    xmlhttp.send(parameters);
}

function NormalAjaxCall(url, target)
{
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = stateChange;
        xmlhttp.open("GET", url, true);
        xmlhttp.send(null);
    }
    else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp.onreadystatechange = stateChange;
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
    }
}

function stateChange() {

    if (xmlhttp.readyState == 4) {
	if (xmlhttp.status == 200 || xmlhttp.status == 0) {
	
            // process whatever has been sent back here
            if (typeof (ajaxtarget) == "function")
            {
                ajaxtarget();
            } //if (typeof (ajaxtarget) == "function")
            else
            {
                ajaxtarget.innerHTML = xmlhttp.responseText;
            }// else
        } //if (xmlhttp.status == 200)
        else {
            alert("There was a problem in the returned data");
        }//else
        ajaxcallinprogress = false;
        if (ajaxcallstack.length > 0) {
            var call = ajaxcallstack.pop();
            InsertAjax(call[0], call[1], call[2]);
        } // if (ajaxcallstack.length > 0)
        
    } //if (xmlhttp.readyState == 4)
} //function stateChange()

function setLoadingDiv(element) {

    //this will display a message that the item is being added to the cart
    var addingToCartMsgNode = document.getElementById('addingToCart');
    var addedToCartMsgNode = document.getElementById('addedToCart');
    if (addingToCartMsgNode && addedToCartMsgNode) {
        addingToCartMsgNode.style.display = 'block';
        addedToCartMsgNode.style.display = 'none';
    } // if the msg nodes exist
    
        element.className = 'miniCartLoading';      
}

function updateMiniCart()
{
    InsertAjax("x-minicartcontent.aspx?randomnumber=" + Math.floor(Math.random() * 10000), document.getElementById("vMiniCart"));    
}

function ajaxifyAddToCartForm(form, productimageid) {
    form.action = removeUrlParamString('returnurl', form.action);
    if(productimageid ==  null || productimageid == "")
    	productimageid = "productImage";
    try {
        form.rel = form.onsubmit;
        if (form.action.indexOf("=") != -1) {
            form.action += "&ajaxcall=true";
        }
        else
        {
            form.action += "?ajaxcall=true";
        }
        form.onsubmit = function() {
            if (this.rel()) {
                MoveElementToElement(document.getElementById(productimageid), document.getElementById('vMiniCart'));
                PostAjaxForm(form);
            }
            return false;
        }
        var button = getElementsByClassName("AddToCartButton", "input", form)[0];
        button.rel = button.onclick;
        button.onclick = function() {
            
            button.parentNode.onsubmit();
            return false;
        }
    }
    catch (Error) {
        //should just post to cart.
    }
}

function jqueryAjaxifyAddToCartForm(form, wrapperSelector, imageSelector) 
{
    // wrapperSelector should contain the nearest wrapper node to the form that also contains the product image
    // imageSelector should be the selector for the product image from the wrapperSelector location in the DOM.
    try 
    {      
    	if($(form).hasClass('ajaxified') != true)
	{  
    		$(form).addClass('ajaxified');
	        form.rel = form.onsubmit;
	        if (form.action.indexOf("?")) {
	            form.action += "&ajaxcall=true";
	        }
	        else {
	            form.action += "?ajaxcall=true";
	        }
	        form.onsubmit = function () {
	            if (this.rel()) {
	                MoveElementToElement($(this).closest(wrapperSelector).find(imageSelector).get(), document.getElementById('vMiniCart'));
	                PostAjaxForm(form);
	            }
	            return false;
	        }
	        var button = getElementsByClassName("AddToCartButton", "input", form)[0];
	        button.rel = button.onclick;
	        button.onclick = function () {

	            button.parentNode.onsubmit();
	            return false;
	        }
	}
    }
    catch (Error) {
        //should just post to cart.
    }
}

function PostAjaxForm(form) {
    ExpandMiniCart();
    var params = "";
    var inputs = form.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++) {
        if (params != "" && params[params.length -1] != "&") {
            params += "&";
        }
        if (inputs[i].name != "" && inputs[i].value) {
            params += inputs[i].name + "=" + inputs[i].value;
        }
    }
    var selects = form.getElementsByTagName("select");
    for (var i = 0; i < selects.length; i++) {
        if (params != "" && params[params.length - 1] != "&") {
            params += "&";
        }
        if (selects[i].name != "") {
            var currentselect = selects[i];
            var currentselectvalue = currentselect[currentselect.selectedIndex].value;
            params += selects[i].name + "=" + escape(currentselectvalue);
        }
    }
    InsertAjax(form.action, updateMiniCart, params, document.getElementById("vMiniCart"));
    if (CollapseMiniCartTimeout)
        clearTimeout(CollapseMiniCartTimeout);
    CollapseMiniCartTimeout = setTimeout('CollapseMiniCart()', 2500);
}

var CollapseMiniCartTimeout;

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

function MoveElementToElement(movingelement, targetelement) {
    $.colorbox.close();
    scrollToElement($("#miniCart"), 1500);
    jQueryMoveElementToElement(movingelement, targetelement);
}

function jQueryMoveElementToElement(movingelement, targetelement) {
    try {
        var $old = $(movingelement);
        var newOffset = $(targetelement).offset();
        var oldOffset = $old.offset();
        var $temp = $old.clone().appendTo('body');
        $temp
          .css('position', 'absolute')
          .css('left', oldOffset.left)
          .css('top', oldOffset.top)
          .css('zIndex', 9999);
        $temp.animate({ 'top': newOffset.top + 10, 'left': newOffset.left + 40, 'width': 0, 'height': 0 }, 1500, "swing", function() {
            $temp.remove();
        });
    }
    catch (err) {
        MooToolsMoveElementToElement(movingelement, targetelement);
    }
}


function MooToolsMoveElementToElement(movingelement, targetelement) {
    try {
        var bdy = document.getElementsByTagName("body")[0];
        var movedcopy = movingelement.clone();
        var startOffset = movingelement.getPosition(bdy);
        var stopOffset = targetelement.getPosition(bdy);
        movedcopy.setStyle("position", "absolute");
        movedcopy.setStyle("top", startOffset.y);
        movedcopy.setStyle("left", startOffset.x);
        movedcopy.setStyle("z-index", "10000");
        movedcopy.inject(bdy);
        movedcopy.makeDraggable();

        new Fx.Move(movedcopy, {
            relativeTo: targetelement,
            position: 'centerTop',
            duration: 800
        }).start();

        //movedcopy.tween('height', 0);
        movedcopy.get('tween', { property: 'height', duration: 1000 }).start(0);
    }
    catch (err) {
        //Handle errors here
    }
}


function ToggleMiniCart(toggleButton) {
    if (toggleButton.className == 'miniCartCollapsed') {
        ExpandMiniCart();
    }
    else {
        CollapseMiniCart();
    }
}

function CollapseMiniCart() {
    var toggleButton = document.getElementById('miniCartArrowLink');
    var cartItemsNode = document.getElementById('miniAbsWrap');

    if (toggleButton) toggleButton.className = 'miniCartCollapsed';
    if (cartItemsNode) cartItemsNode.className = 'hideitems';
}

function ExpandMiniCart() {
    var toggleButton = document.getElementById('miniCartArrowLink');
    var cartItemsNode = document.getElementById('miniAbsWrap');
    
    if(toggleButton) toggleButton.className = 'miniCartExpanded';
    if (cartItemsNode) cartItemsNode.className = 'showitems';
}

function scrollToElement(el, speed, padding) {
    if (!speed) speed = 800;
    if (!padding) padding = 5;
    var os = $(el).offset().top - padding;
    $('html,body').animate({ scrollTop: os }, speed);
}
function getParameterByName(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 decodeURIComponent(results[1].replace(/\+/g, " "));
}

function getUrlParamsbyrefString(url) {
    var idx = url.indexOf('?');
    var paramsbyref = new Array();
    if (idx != -1) {
        var pairs = url.substring(idx + 1, url.length).split('&');
        for (var i = 0; i < pairs.length; i++) {
            nameVal = pairs[i].split('=');
            paramsbyref[i] = nameVal;
        }
    }
    return paramsbyref;
}

function removeUrlParamString(id, instring) {
    var paramsbyref = getUrlParamsbyrefString(instring);
    var idx =  instring.indexOf('?');
    var url = "";

    if (idx != -1)
        url = instring.substring(0, idx);
    else
        url = instring;

    for (var i = 0; i < paramsbyref.length; i++) {
        if (paramsbyref[i][0].toLowerCase() != id.toLowerCase()) {
            if (url.indexOf('=') != -1)
                url += "&";
            else
                url += '?';
            url += paramsbyref[i][0] + "=" + paramsbyref[i][1];
        }
    }
    return url;
}
