var aVariants = new Array();
var deliveryfields = new Array();
var aIncludes = new Array();

$(document).ready(
    function() {
    

        /**
        * Initialize default Ajax settings
        */
        $.ajaxSetup({
            url: '/index.php',
            type: 'get',
            contentType: "application/x-www-form-urlencoded; charset=utf-8",
            beforeSend:function(xhr) {}
        });
    
        // Product tab pages
        $("#ProductMenu tr td a").click(function(event){
            event.preventDefault();
            if ($(this).attr("rev") != undefined && $(this).attr("rev") == "hide")
                $("#buyrow").hide();
            else
                $("#buyrow").show();
            $('div[id^="tab-"]').hide();
            var tab = $("#tab-"+$(this).attr('name'));
            $(tab).show();
            $("#ProductMenu tr td").css('background-color','#FFFFFF');
            $(this).parent().css('background-color','#E2E2E2');
        });

        // Image slider
        $("#slider").easySlider({
                auto: true, 
                continuous: true,
                controlsShow: false,
                speed: 500,
                pause: 4000
        });
        
        // Product main picture change
        $('a[name^="thumbpic"]').click(function(event){
            event.preventDefault();
            $("#productpicture").attr({ src: $(this).attr('href') });
            $("#ProductFullPictureLink").attr("name", $(this).prev().attr("id"));
        });
        
        // Show full product picture
        $("a[rel='ProductSlideshow']").colorbox();
        $("#ProductFullPictureLink").click(function(){
            $("#"+$(this).attr("name")).click();
        });
        
        $(".OrderView").colorbox({width: "850px"});
        
        // Show order info in account
        $("#OrderDetailsDialog").jqm();
        $("td[class='AccountOrderDetails'] > a").bind("click", function(){
            $.ajax({
                data: {page: 'wsOrderDetails', getType: 'partial', tpl: 'Account(OrderDetails)', Id: $(this).attr('name') },
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#OrderDetailsDialog").html('').html(data).jqmShow(); 
                }
            });    
        });
        
        // Add product to basket
        $(".buyProduct,.removeProduct").bind("click", function(event){
            event.preventDefault();
            var Quantity = 1;
            var ProductId = $(this).attr('title');
            //var exchange = new Object;
            var exchange = new Array();
            
            if( $(this).prev().is(':input') ){
                Quantity = $(this).prev().val();
            }
            
            if( $(this).hasClass('removeProduct') ){
                Quantity = 0; 
            }
            
            // Check if there is variants
            if ( $("select[name^='Type-']").length > 0 ){
                var variantIdx = getVariantIdx("Type-");
                if (variantIdx < 0) {
                    alert('Du m\u00E5 velge lengde/st\u00F8rrelse!');
                    return;
                }
                ProductId = aVariants[variantIdx]['ProductId'];
            }
            
            // Check if there is include variants
            if ( $("select[name^='Inc-']").length > 0){
                var failed = false;
                var includeIdx = -1;
                $("select[name^='Inc-']").each(function(idx){
                    if (failed) return;
                    var currentIdx = $(this).attr('name').substr(4,1);
                    if (includeIdx == currentIdx) return;
                    includeIdx = currentIdx;
                    var variantIdx = getVariantIdx("Inc-"+includeIdx+"Type-");
                    if (variantIdx < 0) {
                        alert('Du m\u00E5 velge lengde/st\u00F8rrelse!');
                        failed = true;
                        return;
                    }
                    //exchange['Xchange['+aVariants[variantIdx]['DefaultProductId']+']'] = aVariants[variantIdx]['ProductId']; // exchange['Xchange[OrigProdID]'] = NyProdID
                    exchange[exchange.length] = {'id' : ProductId, 'from' : aVariants[variantIdx]['DefaultProductId'], 'to' : aVariants[variantIdx]['ProductId'] };
                });
                if (failed) return;
            }
            
            var data = {page: 'wsOrder', getType: 'partial', action: 'add', Aid: ProductId, Quantity: Quantity, "Xchange" : exchange };
            //for (attr in exchange) { data[attr] = exchange[attr]; }
            
            $.ajax({
                data: data,
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#m4.handlekurv").html('').html(data);
                    $("#addedcart").show("fast").delay(3000).hide("fast");
                    if ( $(".dynamicOrderContent").length > 0 ){
                         $.ajax({
                            data: {page: 'wsOrder', getType: 'partial', tpl: 'Order(Dynamic)' },
                            success: function(data, textStatus, XMLHttpRequest) {    
                                $(".dynamicOrderContent").html(data);    
                            }
                         });
                    }
                }
            });
        });
        
        // Remove product from basket
        $("[name='CartRemoveProduct']").live('click', function(){
            $.ajax({
                url: '/index.php?page=wsOrder&getType=partial&action=changeQuantity&Aid=' + $(this).parent().parent().find("[name='ProductID']").val() + '&Quantity=0',
                type: 'get',
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#m4.handlekurv").html('').html(data);
                }
            });        
        });
        
        // Update all product quantity in basket
        $("#UpdateCartAll").live('click', function(){
            var query = "";
            $("[name='CartProductRow']").each(function(){
                query += "&Updates[]=" + $(this).find("[name='ProductID']").val() + "|" + $(this).find("[name='Quantity']").val();
            });
            $.ajax({
                url: '/index.php?page=wsOrder&getType=partial&action=changeQuantity' + query,
                type: 'get',
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#m4.handlekurv").html('').html(data);
                }
            });
        });
        
        // Add productlist filter handler
        $(".productlistfilter").change(function(){
            var query = $("#sortorder").val();
            query += "&pid="+$("#ProductID").attr("title");
            query += "&stockonly="+$("#filterstock:checked").length;
            var idkey = "detailfilter";
            $('select[id^="'+idkey+'"] option:selected').each(function () {
                var filtertext = $(this).text();
                if ($(this).val() == 0)
                    filtertext = 0;
                query += "&detailfilter[]=" + $(this).parent().attr('id').substr(idkey.length) + "|" + filtertext;
            });
            $.ajax({
                url: '/index.php?page=wsProductlist&getType=partial&Id=' + $("#SubCatId").val() + '&tpl=Productlist(Partial)&' + query,
                type: 'get',
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#partial").html('').html(data);
                    $("#ProductCount").html('').html($("#ProductListCount").html());
                    $("#PrevProductLink").attr('href', $("#ProductPrev").html());
                    $("#NextProductLink").attr('href', $("#ProductNext").html());
                }
            });
        });
        
        // Submit NewUser form (copy user to email first)
        $(".NewUserSubmit").live('click', function(event){
            event.preventDefault();
            var form = $(this).parents("form");
            var user = $(form).find("input[name='Account[Username]']");
            var email = $(form).find("input[name='Account[Email]']");
            if (($(user).length != 0) && ($(email).length != 0))
                $(email).val($(user).val());
            $(form).submit();
        });
        
        // Validate NewUser form in menu
        $("#MenuNewUserForm").validate({
            errorClass: "FormError",
            showErrors: function() {
                for ( var i = 0; this.errorList[i]; i++ ) {
                    this.settings.highlight.call( this, this.errorList[i].element, this.settings.errorClass, this.settings.validClass );
                }
                if (this.settings.unhighlight) {
                    for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
                        this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
                    }
                }
            },
            rules: {
                "Account[Username]": {
                    required: true,
                    email: true
                },
                "Account[ConfirmEmail]": {
                    equalTo: "#mUserName"
                },
                "Account[Firstname]": {
                    required: true,
                    minlength: 2
                },
                "Account[Surname]": {
                    required: true,
                    minlength: 2
                }
            }
        });
        
        // Show streetaddress fields
        $("#streetaddressmenu > a").bind('click', function(){
            $('div[name="streetaddress"]').show();
            $(this).hide();
        });
        
        // Resend password
        $("#ResendEmail").find("input[class='plainbutton']").click(function(){
            if ( $("#ResendEmail").find("input:first").val().length > 3 ){

                req = $.ajax({
                    dataType: 'json',
                    data: {'method' : 'ResendPassword', 'getType' : 'json', 'param[email]' :$("#ResendEmail").find("input:first").val() },
                    contentType: 'application/json; charset=utf-8',
                    timeout: 2000,
                    url: '/RPC',
                    success: function (Response) {
                        if ( Response !== null ){
                            $("#ResendEmailMessage").html('').html(Texts.ResendPassword.invalidEmailAddress).show();
                            $("#ResendEmail").find('input:first').focus().select();
                        }else{
                            var text = $.template(Texts.ResendPassword.success);
                            $("#ResendEmailMessage").html(text.apply({email: $("#ResendEmail").find("input:first").val()})).show();
                        }
                    },
                    error: function(){
                        $("#ResendEmail").find('input:first').focus().select(); 
                        req.abort();
                    }
                });

            }else{  
                $("#ResendEmailMessage").html('').html(Texts.ResendPassword.invalidEmailAddress);
                $("#ResendEmail").find('input:first').focus();
            }
        });
        
        // Fill Variantboxes
        if ( $("select[name*='Type-']").length > 0 ){
            var TypeCount = $("select[name^='Type-']").length;  // if includes then 0 because of ^=
            $("select[name*='Type-']").each(function(idx){
                var obj = $(this)[0];
                $.each( aVariants, function(idx){
                    if (TypeCount < 2) {
                        addOption(obj, {value: aVariants[idx][obj.name], text: aVariants[idx]['ProductName'], id: aVariants[idx]['ProductNumber'] });
                    } else {
                        addOption(obj, {value: aVariants[idx][obj.name], text: aVariants[idx][obj.name] });
                    }
                })    
            } );
        };
        
        // Add Varianthandler
        $("select[name*='Type-']").bind('change', function(){
            VariantChanged();
        });
        
        $("select[name='Type-0']").sortOptionsByIdCustom();
        $("select[name='Type-0'] option").first().attr("selected",true);
        
        
        $(".ContactForm").click(function(event){
            event.preventDefault();
            $("[name='resultok']").hide();
            $("[name='resultnotok']").hide();
            var form = $(this).parents("form");
            $.ajax({
                data: {
                    'getType' : 'partial',
                    'fullname' : $(form).find("[name='fullname']").val(),
                    'email' : $(form).find("[name='email']").val(),
                    'message' : $(form).find("[name='message']").val(),
                    'copyme' : ($(form).find("[name='copyme']").attr('checked')==true) ? "1" : "0" },
                    url: '/SendContactForm',
                    type: 'get',
                    success: function (data){
                    if (data == "OK") {
                        $(form).find("[name='fullname']").val('');
                        $(form).find("[name='email']").val('');
                        $(form).find("[name='message']").val('');
                        $(form).find("[name='resultok']").show();
                    } else {
                        $("[name='resultnotok']").show();
                    }
                }
            });
        });
        
        $(".ProductSearchForm").submit(function(){
            fixsearch();
        });
        
        // 
        $("#CheckoutUpdate").live('click', function(){
            var query = "";
            $("[name='CheckoutProductRow']").each(function(){
                query += "&Updates[]=" + $(this).find("[name='ProductID']").val() + "|" + $(this).find("[name='Quantity']").val();
            });
            $.ajax({
                url: '/index.php?page=wsOrder&getType=partial&action=changeQuantity' + query,
                type: 'get',
                success: function(data, textStatus, XMLHttpRequest) {
                    $("#m4.handlekurv").html('').html(data);
                    $.ajax({
                        url: '/index.php?page=wsCheckout&getType=partial&tpl=Checkout(Partial)',
                        type: 'get',
                        success: function(data, textStatus, XMLHttpRequest) {
                            $("#checkoutpartial").html('').html(data);
                        }
                    });
                }
            });
        });
        
        $("input[name='ProductImage']").live('change', function(){
            $("#ProductImg").attr("src", $(this).val());
        });
        
        $("[name='Order[PartialDelivery]']").change(function(){
            $("#Checkout3Form").submit();
        });
        
        $("[name='Payment[Type]']").change(function(){
            $("#Checkout3Form").submit();
        });
        
        $("[name='Shipment[Type]']").change(function(){
            $("#Checkout3Form").submit();
        });
        
        $("[name='OrderAddress']").change(function(){
            if ($(this).val() == "invoice") {
                //$(".deliveryenable").attr("disabled", true);
                deliveryfields['CompanyName'] = $("[name='Deliveryaddress[CompanyName]']").val();
                $("[name='Deliveryaddress[CompanyName]']").val(invoicefields['CompanyName']);
                deliveryfields['Firstname'] = $("[name='Deliveryaddress[Firstname]']").val();
                $("[name='Deliveryaddress[Firstname]']").val(invoicefields['Firstname']);
                deliveryfields['Surname'] = $("[name='Deliveryaddress[Surname]']").val();
                $("[name='Deliveryaddress[Surname]']").val(invoicefields['Surname']);
                deliveryfields['address1'] = $("[name='Deliveryaddress[Address1]']").val();
                $("[name='Deliveryaddress[Address1]']").val(invoicefields['Address1']);
                deliveryfields['Zipcode'] = $("[name='Deliveryaddress[Zipcode]']").val();
                $("[name='Deliveryaddress[Zipcode]']").val(invoicefields['Zipcode']);
                deliveryfields['City'] = $("[name='Deliveryaddress[City]']").val();
                $("[name='Deliveryaddress[City]']").val(invoicefields['City']);
                deliveryfields['Telephone'] = $("[name='Deliveryaddress[Telephone]']").val();
                $("[name='Deliveryaddress[Telephone]']").val(invoicefields['Telephone']);
                deliveryfields['Cellphone'] = $("[name='Deliveryaddress[Cellphone]']").val();
                $("[name='Deliveryaddress[Cellphone]']").val(invoicefields['Cellphone']);
            } else {
                $(".deliveryenable").attr("disabled", false);
                $("[name='Deliveryaddress[CompanyName]']").val(deliveryfields['CompanyName']);
                $("[name='Deliveryaddress[Firstname]']").val(deliveryfields['Firstname']);
                $("[name='Deliveryaddress[Surname]']").val(deliveryfields['Surname']);
                $("[name='Deliveryaddress[Address1]']").val(deliveryfields['address1']);
                $("[name='Deliveryaddress[Zipcode]']").val(deliveryfields['Zipcode']);
                $("[name='Deliveryaddress[City]']").val(deliveryfields['City']);
                $("[name='Deliveryaddress[Telephone]']").val(deliveryfields['Telephone']);
                $("[name='Deliveryaddress[Cellphone]']").val(deliveryfields['Cellphone']);
            }
        });
        
        $("#Checkout2Form").submit(function(){
            if ($.trim($("[name='Deliveryaddress[Zipcode]']").val()) == "") {
                $("[name='Deliveryaddress[CompanyName]']").val("");
                $("[name='Deliveryaddress[Firstname]']").val("");
                $("[name='Deliveryaddress[Surname]']").val("");
                $("[name='Deliveryaddress[Address1]']").val("");
                $("[name='Deliveryaddress[Zipcode]']").val("");
                $("[name='Deliveryaddress[City]']").val("");
                $("[name='Deliveryaddress[Telephone]']").val("");
                $("[name='Deliveryaddress[Cellphone]']").val("");
            }
        });

    }
);

function fixsearch (){
    $("[name='Query']").val('"'+$("[name='searchfield']").val()+'"');
}
    
function addOption(obj, option){
    if ( $(obj).find("option[value='"+option.value+"']").length <= 0 && option.value != undefined ){
        if (option.id != undefined)
            $(obj).append('<option id="'+option.id+'" value="'+option.value+'">' + option.text + '</option>');
        else
            $(obj).append('<option value="'+option.value+'">' + option.text + '</option>');
    }
}

function getVariantIdx(selectname){
    var key = "";
    var keylen = 0;
    var ret = -1;
    
    if ( $("select[name^='"+selectname+"']").length > 0 ){
        $("select[name^='"+selectname+"']").each( function(){
            keylen++;
            key = key + $(this).val() + "-";
        })        
    }
    
    if ( key != "" ){
        $.each( aVariants, function(idx){
            var compare = '';            
            for( i=0; i < keylen; i++ ){
                compare = compare + aVariants[idx][selectname+i] +"-";
                if ( key == compare ){
                    ret = idx;
                }
            }
        })
    }
    
    return ret;
}

jQuery.fn.sort = function(){
    return this.pushStack([].sort.apply(this, arguments), []);
};

jQuery.fn.sortOptions = function(sortCallback){
    jQuery('option', this)
        .sort(sortCallback)
        .appendTo(this);
    return this;
};

jQuery.fn.sortOptionsByText = function(){
    var byTextSortCallback = function(x, y){
        var xText = jQuery(x).text().toUpperCase();
        var yText = jQuery(y).text().toUpperCase();
        return (xText < yText) ? -1 : (xText > yText) ? 1 : 0;
    };
    return this.sortOptions(byTextSortCallback);
};

jQuery.fn.sortOptionsByValue = function(){
    var byValueSortCallback = function(x, y){
        var xVal = ( jQuery(x).val() * 1 );
        var yVal = ( jQuery(y).val() * 1 );
        return (xVal < yVal) ? -1 : (xVal > yVal) ? 1 : 0;
    };
    return this.sortOptions(byValueSortCallback);
};

jQuery.fn.sortOptionsByIdCustom = function(){
    var byValueSortCallback = function(x, y){
        var xVal = jQuery(x).attr('id');
        var yVal = jQuery(y).attr('id');
        return (xVal < yVal) ? -1 : (xVal > yVal) ? 1 : 0;
    };
    return this.sortOptions(byValueSortCallback);
};

function getIncludeCount(){
    var includeIdx = -1;
    $("select[name^='Inc-']").each(function(idx){
        var currentIdx = parseInt($(this).attr('name').substr(4,1));
        if (includeIdx == currentIdx) return;
        includeIdx = currentIdx;
    });
    return includeIdx+1;
}

function updateProduct(ProductId){
    $.ajax({
        dataType: 'json',
        data: {
            'method' : 'product',
            'getType' : 'json',
            'param[id]' : ProductId },
        url: '/RPC',
        success: function (data){
        
            var inorder = 0;
            var dd = '';
            if (data[0].Variant != null) {
                for (i = 0; i < data[0].Variant.length; i++) {
                    var variant = getVariantById(data[0].Variant[i].Id);
                    variant['ProductStock'] = data[0].Variant[i].Stock.Total;
                    variant['ProductStockInOrder'] = data[0].Variant[i].Stock.inOrder;
                    variant['DeliveryDate'] = data[0].Variant[i].Stock.DeliveryDate;
                    if (data[0].Variant[i].Stock.inOrder == 1) {
                        inorder = 1;
                        dd = data[0].Variant[i].Stock.DeliveryDate;
                    }
                }
            }
            
            if (typeof(ProductInfo) == "undefined") {
                $("#ProductStock").html('').html(getProductStock(data[0].Stock.Total, data[0].Stock.inOrder, data[0].Stock.DeliveryDate));
                return;
            }
                
            ProductInfo['ProductStock'] = data[0].Stock.Total;
            if (data[0].Stock.inOrder == 0) {
                ProductInfo['ProductStockInOrder'] = inorder;
                ProductInfo['DeliveryDate'] = dd;
            } else {
                ProductInfo['ProductStockInOrder'] = data[0].Stock.inOrder;
                ProductInfo['DeliveryDate'] = data[0].Stock.DeliveryDate;
            }
            
            VariantChanged();
        }
    });
}

function updateProducts(){
    var query = "?method=product&getType=json";
    $(".ProductListItem").each(function(){
        query += "&param[id][]=" + $(this).attr("name");
    });
    $.ajax({
        dataType: 'json',
        url: '/RPC' + query,
        success: function (data){
            for(i = 0; i < data.length; i++){
                var stock = data[i].Stock.Total;
                var inorder = data[i].Stock.inOrder;
                var dd = data[i].Stock.DeliveryDate;
                if (data[i].Stock.Total <= 0 && data[i].Stock.inOrder == 0) {
                    if (data[i].Includes != null && data[i].Includes.length > 0){
                        stock = -1;
                        inorder = -1;
                        for (k = 0; k < data[i].Includes.length; k++){
                            if (stock == -1 || data[i].Includes[k].Stock.Total < stock)
                                stock = data[i].Includes[k].Stock.Total;
                            if (inorder == -1 || (inorder == 1 && data[i].Includes[k].Stock.inOrder == 0)) {
                                inorder = data[i].Includes[k].Stock.inOrder;
                                dd = data[i].Includes[k].Stock.DeliveryDate;
                            }
                        }
                    } else if (data[i].Variant != null) {                        
                        for (j = 0; j < data[i].Variant.length; j++){
                            if (data[i].Variant[j].Stock.inOrder == 1) {
                                inorder = 1;
                                dd = data[i].Variant[j].Stock.DeliveryDate;
                            }
                        }
                    }
                }
                var item = $(".ProductListItem[name='"+data[i].Id+"']");
                $(item).find(".ProductListStock").html('').html(getProductStock(stock, inorder, dd));
            }
        }
    });
}

function getProductStock( ProductStock, ProductStockInOrder, DeliveryDate ){
    if ( ProductStock <= 0 ){
        if (ProductStockInOrder == 1 || ProductStockInOrder == "1") {
            return '<img src="_Plugins/Webshop/Templates/www.wakeshop.no/images/stockwarn.gif" alt=""/>&nbsp;&nbsp;Ventet inn '+DeliveryDate;
        } else {
            return '<img src="_Plugins/Webshop/Templates/www.wakeshop.no/images/outofstock.gif" alt=""/>&nbsp;&nbsp;Ikke lagervare';
        }
    }else{
        return '<img src="_Plugins/Webshop/Templates/www.wakeshop.no/images/instock.gif" alt=""/>&nbsp;&nbsp;'+ProductStock+'&nbsp;stk. p&aring; lager';
    }
}

function getVariantById(ProductId){
    for (i = 0; i < aVariants.length; i++){
        if (aVariants[i]['ProductId'] == ProductId)
            return aVariants[i];
    }
    return new Array();
}

function VariantChanged(){
    var includeCount = getIncludeCount();
    var r = includeCount;
    if (r == 0) r = 1;
    
    var ProductStock = -1;
    var ProductStockInOrder = -1;
    var DeliveryDate = '';
    var failed = false;
    
    for (var i = 0; i < r; i++) {
        var filter = 'Type-';
        if (includeCount > 0)
            filter = 'Inc-' + i + 'Type-';
        var variantIdx = getVariantIdx(filter);

        var sourceArray;
        if (variantIdx >= 0)
            sourceArray = aVariants[variantIdx];
        else if (includeCount > 0)
            sourceArray = aIncludes[i];
        else {
            failed = true;
            break;
        }

        var stock = sourceArray['ProductStock'];
        if (ProductStock == -1 || stock < ProductStock)
            ProductStock = stock;
        var inorder = sourceArray['ProductStockInOrder'];
        if (ProductStockInOrder == -1 || inorder < ProductStockInOrder)
            ProductStockInOrder = inorder;
        var ddate = sourceArray['DeliveryDate'];
        if (DeliveryDate == '')  // TODO: if (ddate < DeliveryDate)
            DeliveryDate = ddate;
    }
    
    if (failed) {
        if (typeof(ProductInfo) == "undefined")
            return;
        ProductStock = ProductInfo['ProductStock'];
        ProductStockInOrder = ProductInfo['ProductStockInOrder'];
        DeliveryDate = ProductInfo['DeliveryDate'];
    }
    
    $("#ProductStock").html('').html(getProductStock(ProductStock, ProductStockInOrder, DeliveryDate));
}

