/*
Copyright (c) 2009, PocketGear Inc. All rights reserved.
PocketGear.com Base JS version 2.0.1
*/


// FUNCTIONS FOR SUBMITTING FORMS USING ENTER
function submitenter(myfield,e)
{
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
else return true;
//alert(navigator.appName);
if (keycode == 13 && navigator.appName == "Microsoft Internet Explorer")
   {
   myfield.form.submit();
   return false;
   }
else
   return true;
}

jQuery.fn.hoverClass = function(value) {
  return this.hover(function() {
    jQuery(this).addClass(value);
  }, function() {
    jQuery(this).removeClass(value)
  });
};


var jsv = "javascript:void(0);";

var ds = {
    ds: null,
    open: null,
    view: null,
    ds_dev: null,
    ds_os: null,
    
    devManu: "",
    devices: Array(),
    current: "",
    
    unit: 8,
    cutoff: 10,
    cols: 6,
    
    target: "selector",
    
    init: function() {
        $("#ds").each( function() {
            ds.ds = this;
            
            if ($("#ds_open").length == 0) {
                ds.build(); 
            }
            
            $(this).find(".view:first").each( function() { ds.view = $(this).eq(0); });
            $("#ds_dev").each( function() { ds.ds_dev = this; });
            $("#ds_os").each( function() { ds.ds_os = this; });

            $("#ds_dev, #ds_os").siblings("h3").click( function() {
                var menu = $(this).siblings("div").find("ul.sel");
                if ($(menu).hasClass("open")) {
                    $(this).removeClass("open").parent().css("z-index","");
                    $(menu).removeClass("open").fadeTo(200,0);
                    
                } else {

                    $("#ds_dev, #ds_os")
                        .removeClass("open")
                        .find("ul.sel").removeClass("open").end()
                        .find("ul.sel").fadeTo(500,0).end()
                        .siblings("h3").removeClass("open")
                        .parent().css("z-index","");
                        
                    $(this).addClass("open").parent().css("z-index","9");
                    $(menu).addClass("open").css("display","block").fadeTo(0,1);
                    
                    var flyout = 1; 
                    var column = 0;
                    var pause  = 0;
                    $(menu).find(".col").each( function() {
                        flyout = 1;
                        column++;
                        $(this).find("> li").not(".h").each( function() {
                            $(this).fadeTo(120*column, 0).fadeTo(30*flyout++, 0).fadeTo(flyout,1);
                        });
                    });
                }
            });
            
            ds.activate();
            ds.filterTabs();
            ds.setSwap();
        });
        
        // Add functionality to the device pulldown for adding devices.
        //
        $("#add_device_manufacturer").click( function() {
            if (!$(this).hasClass("open")) {
                ds.target = "add_device";
                
                $(this).addClass("open").click();
                
                $("#ds_sel").slideUp("fast");
                $("#ds_unsel").slideDown("fast");
                $("#ds_dev").siblings("h3").click();
            }
        });
    },
    
    filterTabs: function() {
        $("#h_os").each( function() {
            $(this).find("a").each( function() {
                var a = this;
                if ($(this).siblings("span.os").length > 0) {
                    var id = $(a).attr("href");
                    $(a).attr("href",jsv).click( function(e) {
                        ds.check(e,id);
                    });
                }
            });
        });
    },
    
    build: function() {
        var o = $("<div></div>").attr("id", "ds_open");
        
        var t = $("<div></div>").addClass("title").html("Loading...").appendTo(o);
        var c = $("<a></a>").addClass("close").html("Close").click( function() { ds.close(); }).appendTo(o);
        var d = $("<ul></ul>").addClass("devices").addClass("os_box").appendTo(o);

        var ll = $("<li></li>").addClass("loading").html("<h3>Loading Devices</h3>");
        $(d).append(ll);
        
        for (var i=0; i<8; i++) {
            var li = $("<li></li>");
            if (!(i%4)) $(li).addClass("line");
            $(li).appendTo(d);
            
            var la = $("<a></a>").attr("href", jsv).appendTo(li);
            $("<img />").attr("src", "img/pixel.gif").attr("alt", "Loading...").appendTo(la);

            $("<h4></h4>").html("Loading...").appendTo(li);            
        }

        var dd = $("<div></div>").addClass("details").appendTo(o);
        ds.writeDetails(dd);

        var n  = $("<div></div>").addClass("nav");
        var al = $("<a></a>").attr("href", jsv).html("&#171; Last Group").addClass("prev");
        var an = $("<a></a>").attr("href", jsv).html("Next Group &#187;").addClass("next");
        
        $(n).append(al).append(an);
        $(dd).prepend(n);
        
        // $(ds.ds).append(o);
        $(document.body).append(o);
        
        ds.open = o;
    },
    
    writeDetails: function(d) {
        $("<p></p>").html("<p>Please select your device from the choices above. If there are more than 8 devices from this manufacturer, you can scroll " +
            "through them by clicking the <b>Next Group</b> link above. If you are still unable to find " +
            "your device, please consider (A) browsing by your device's operating system below " + 
            "and (B) <a href=\"contactUs.jsp?supportRequest=missingDevice\">letting us know</a> " +
            "your device model so we can add it.</p>").appendTo(d);

        $("<ol></ol>").addClass("oses").each( function() {
            var ol = this;
            $("#ds_os").find("li").each( function() {
                var cls = $(this).find("span").attr("class");
                var li = $(this).clone(true).hoverClass("hover").appendTo(ol);
                var id = $(li).find("a").attr("href");
                $(li).find("a").attr("href",jsv).attr("class",cls).end().find("span").remove();

                var o = Array(id, "", "os");
                $(li).click( function(e) { ds.select(e, o); })
                    .hoverClass("hover").append($(li).find("a").text());
            });

            $(ol).appendTo(d);
        });
    },
    setSwap: function() {
        $(ds.ds).find("a.swap").click( function() { ds.swap(this, ""); });
    },
    swap: function(e,o) {
        if (o != "") {
            $(ds.view).removeClass("ds_sel").removeClass("ds_unsel").addClass(o);
            $("<img />").attr("src","img/ds_load.gif").appendTo(ds.view);
            
        } else {
            if ($(e).parents("#ds_sel").length) {
                $("#ds_sel").slideUp();
                $("#ds_unsel").slideDown();
            } else {
                $("#ds_sel").slideDown();
                $("#ds_unsel").slideUp();
            }
        }
    },
    
    activate: function() {
        var ds_dev_closed = $("<ul></ul>");
        var prev = null;
        
        for (var j=0; j<2; j++) {
            var d = (j==0) ? ds.ds_os : ds.ds_dev;
            var od = (j==0) ? "os" : "device";
            
            $(d).find("a").each( function() {
                var a = this;
                var dod = od;
                
                var val = $(this).attr("href");
                $(this).attr("href", jsv).click( function(e) { ds.select(e, [val, $(a).html(), dod]); });

                // Count up the devices and hide those less than the threshold under "More Devices"
                //
                if (od == "device") {
                    var cnt = 0;
                    $(this).find("span.count").each( function() {
                        cnt = parseInt($(this).text());
                        $(this).parent().attr("count", cnt);
                        $(this).remove();
                    });
                    if (cnt > 0) $(a).html($(a).html() + "<span class=\"count\">("+cnt+")</span>");
                    if (cnt >= ds.cutoff) {
                        var li = $(this).parent();
                        
                        $(li).addClass("larger"); // ds_dev_closed).append($(this).clone(true)); // $(a).parents("li").addClass("h");
                        if (prev) {
                            $(li).insertAfter(prev);
                        } else {
                            $(li).insertBefore($(li).siblings("li:first"));
                        }
                        prev = li;
                    }
                }
            });
            if (prev) {
                $("<li class='divider'>Others:</li>").insertAfter(prev);
            }
            
            var cnt_visible = $(d).find("li").not(".h").length;
            var cnt_other   = $(d).find("li.h").length;

            if (cnt_other > 0) {
                var li  = $("<li></li>").addClass("moreList");
                var lic = $(li).clone(true).addClass("moreList").addClass("lessList");
                
                var lia = $("<a></a>").click( function() {
                    $(this).parents("ul.sel").each( function() {
                        if ($(this).hasClass("visible")) {
                            $(this).removeClass("visible").find("li").each( function() {
                                $(this).filter(".h").fadeTo(300,0).end().not(".h").removeClass("dull");
                            });
                        } else {
                            $(this).addClass("visible").find("li").each( function() {
                                $(this).filter(".h").fadeTo(300,1).end().not(".h").addClass("dull");
                            });
                        }
                        
                        ds.balanceColumns(this);
                        $(this).find("li").css("opacity","1");
                    });
                }).html("More Devices &#187;");
                
                var liac = $(lia).clone(true);
                $(liac).html("&#171; Fewer Devices");
                
                $("#ds_dev ul.sel:first").each( function() {
                    $(li).append(lia).appendTo(this);
                    $(lic).append(liac).appendTo(this);
                });
            }

            ds.balanceColumns("#ds_dev ul.sel:first");
        }
    },
    balanceColumns: function(target) {
        // Balance the columns. Wrap the LI's in DIVs, divided by 6.
        //
        $(target).each( function() {
            var all = $(this).find("li");
            var lis = $(this).find("li").not(".h");
            var per_col = Math.ceil(lis.length / ds.cols);

            $(this).find("li").appendTo(this);
            $(this).find("div.col").remove();
            
            var d = null;
            var current = 0;
            
            for (var i = 0; i < all.length; i++) {
                if (current % per_col == 0 && $(d).find("li.h").length != $(d).find("li").length) {
                    if (d) {
                        var nd = $(d).clone(true);
                        $(this).append(nd);
                    }
                    d = $("<div></div>").addClass("col");
                }

                var li = all[i];
                if (li) {
                    $(d).append($(li).css("opacity","0"));
                }
                if ($(li).hasClass(".h") && $(this).not(".visible").length > 0) current--;
                current++;
            }
            if (d) $(this).append(d);
                
            $(this).find(".col").each( function() {
                if($(this).find("li").length == 0) {
                    $(this).remove();
                }
            });
            $(this).find("> ul").not(".col").remove();

            $(this).find(".col:nth-child(even)").addClass("col_even");
 
            $(this).width(ds.cols * (parseInt($(d).css("width"))));
            
            // Add a title area.
            //
            $(this).find(".title").remove();
            $("<div></div>").addClass("title").insertBefore($(this).find(".col:first"))
                .html("Select the manufacturer of your device from the following list (most popular first):");
                
                
            // Add a "close" button.
            //
            $("<a></a>").attr("href",jsv).html("Close").addClass("close")
                .click( function() { $("#ds_dev").siblings("h3").click(); } ).appendTo(this);
        });
    },
    clearURL: function(url) {
	url = " " + url;
	var arr = url.split("/");
	var file = arr[arr.length-1];
	url = $.trim( url.replace(file, "") );

	return url;
    },
    
    close: function(e) {
        vis.toggleShade(0);
        $(ds.open).css("display","none").addClass("loading");
    },
    select: function(e, o) {
        if (o) {
            var val   = o[0];
            var title = o[1];
            var type  = o[2];

	    val = val.replace( ds.clearURL(window.location), "" );

            switch (type) {
                case "os":  
                    ds.check(null,val);
                break;
                
                default:
                    if (val != "") {
                        vis.toggleShade(9000);
                        
			$(ds.open).find("ul.devices:first").empty().end()
				.addClass("loading").css("display","block")
				.find(".title").text("Loading...");
                        var ep = "includes/devicesByManufacturer.jsp";
                        // ep = "_devices.xml";
                        
                        ds.devManu = title;

                        $.ajax({
                            type: "GET",
                            data: "manId=" + val,
                            dataType: "xml",
                            url: ep,
                            cache: false,
                            
                            success: ds.populate,
                            error: ds.fail
                        });
                    }
                break;
            }
        }
    },
    
    populate: function(o) {
        ds.devices = Array();
        
        // remove all LI children
        var dul = $(ds.open).find("ul.devices:first"); 
        $(dul).empty();

	$("phone", o).each( function() {
            var id = $(this).attr("id");
            var name  = $("name", this).text();
            var sort  = $("pocketgear_sortorder", this).text();
            var image = $("imageurl", this).text();
            var os    = $("phoneos", this).text();

            ds.devices.push({ "phone": name, "id": id, "sort_order": sort, "thumb": image, "os": os });
        });

        // Add all children but make only the first 8 visible
        max = ds.devices.length;
        while (max%ds.unit) max++;

        for (var i=0; i<max; i++) {
            var p = "&nbsp;", id = "", t = "";

            $(ds.open).each( function() {
                var li  = $("<li></li>").appendTo(dul);
                var lia = $("<a></a>").attr("href",jsv).appendTo(li);
                var img = $("<img />").appendTo(lia);                   
                    
                if (!(i%4)) $(li).addClass("line");

                if (i < ds.devices.length) {
                    p  = ds.devices[i]["phone"];
                    id = ds.devices[i]["id"];
                    os = ds.devices[i]["os"];
                    t  = ds.devices[i]["thumb"];
                    s  = ds.devices[i]["sort_order"].replace(/-/g,"");
                    
                    $(lia).addClass("noimage");
                    $(li).click( function(e) { ds.current = $(this).text(); ds.check(e,$(this).attr("deviceId")); })
                            .hover( function(e) { vis.hover(e, this); },
                                function(e) { vis.hover(e, this); })
                            .attr("sortName", p)
                            .attr("sortDate", s)
                            .attr("deviceId", id)
                            .each( function() { ds.applyOS(os, this); });
    
                } else {
                    $(lia).addClass("empty");
                }

                $(img).attr("src", "img/pixel.gif").attr("alt", "");

                if (t != "") {
                    $(img).attr("src", t).attr("alt", p);
                    $(lia).removeClass("noimage").removeClass("empty");
                }

                $("<h4></h4>").html(p).appendTo(li);
            });
        }
        
        ds.display(null,[1,8]);
        $(ds.open).removeClass("loading");
        
        // toggle sort the lists to shake out any IE weirdness
        ds.sort("alpha"); ds.sort("chrono");
    },
    fail: function(o) {
        // general failure message
    },
    
    display: function(event,boundaries) {
        var start = boundaries[0]; var end = boundaries[1];

        // simply turn on visibility (i.e. remove "hidden" class) for the current window boundaries
        $(ds.open).find("ul.devices").each( function() {
            var cnt = 1;
            $(this).find("li").each( function() {
                if (cnt >= start && cnt <= end) {
                    $(this).removeClass("h");
                } else {
                    $(this).addClass("h");
                }
                cnt++;
            });
            
            ds.setNav(start,end);
            ds.setTitle(start,end);
        });
    },

    setNav: function(s,e) {
        var u = ds.unit;
        
        var prev = $(ds.open).find("a.prev:first").unbind("click").removeClass("active");
        var next = $(ds.open).find("a.next:first").unbind("click").removeClass("active");

        if (s - u > 0) {
            ps = s - u;
            pe = s - 1;
        } else {
            ps = 1;
            pe = u;
        }
        if (s > 1) {
            $(prev).click( function(e) { ds.display(e, [ps,pe]); }).addClass("active");
        }
        
        var max = ds.devices.length;
        while (max%ds.unit) max++;
        if (s + u < max) {
            ns = s + u;
            ne = e + u;
            if (ne > max) ne = max;
        } else {
            ns = max;
        }

        if (ns < max) {
            $(next).click( function(e) { ds.display(e, [ns,ne]); }).addClass("active");
        }
    },
    setTitle: function(s,e) {
        if (e > ds.devices.length) e = ds.devices.length;
        
        var t = $(ds.open).find("div.title:first").html(ds.devManu + ": Devices " +s+ "-"+e+" of " + ds.devices.length);
        
        var a = $("<a></a>").attr("href", jsv).addClass("thumbs")
        .text( ($(ds.open).hasClass("text") ? "// Viewing TEXT" : "// Viewing THUMBNAILS" ))
            .click( function(e) { ds.textToggle(e, a); }).appendTo(t); 
        
        var s = $("<a></a>").attr("href", jsv).addClass("sort")
            .text( ($(ds.open).hasClass("nameSort") ? "// Sorted By NAME" : "// Sorted By DATE" )) 
            .click( function(e) { ds.sortToggle(e, s); }).appendTo(t);
    },
    
    check: function(e,id) {
        if (ds.target == "add_device") {
            ds.setDevice(id);
            return true;
        }
        
        var ep = 'includes/incompatibleScProductsXML.jsp';
        // ep = '_incompatible.xml';

        $.ajax({
            type: "GET",
            data: "newDeviceId=" + id,
            dataType: "xml",
            url: ep,
            cache: false,
            
            success: function(xml) {
                ds.warn(id, xml, e);
            },
            error: ds.fail
        });
    },
    warn: function(id, xml, e) {
        var p = $("product", xml);

        if (p.length == 0) {
            // no problem, let them continue
            ds.change(id);
            
        } else {
            var ul = $("<ul></ul>");
            
            $(p).each( function() {
                var name = $("name", this).text();
                var dev  = $("company", this).text();
                
                $("<li></li>")
                    .html(name + " <span class='dev'>by " + dev + "</span>")
                    .appendTo(ul);
            });
            
            ds.warnConf(null);

            var incomp = $("<div></div>").attr("id", "warn").each( function() {
                $("<h3></h3>").text("Incompatible Products").appendTo(this);
                $("<p></p>").text("The following products are not compatible with the device or " +
                    "operating system that you have selected. Do you wish to continue?").appendTo(this);
                
                $(this).append(ul);
                
                $("<a></a>").attr("href", jsv).text("Continue").click( function(e) { ds.warnConf(id); } ).appendTo(this);
                $("<a></a>").attr("href", jsv).text("Cancel").click( function(e) { ds.warnConf(null); } ).appendTo(this);                
            }).css("margin", "0").appendTo(document.body);

            var bh = $(window).height();
            var bw = $(window).width();
            var eh = $(incomp).height();
            var ew = $(incomp).width();

            $(incomp).css("top", ((bh/2) - (eh/2)) + "px");
            $(incomp).css("left", ((bw/2) - (ew/2)) + "px");

            vis.toggleShade(29);
        }
    },
    warnConf: function(id) {
        $("#warn").each( function() {
            $(this).remove();
            if (id) ds.change(id);
            vis.toggleShade(0);
        });
    },
    
    change: function(id) {
        ds.swap(null, "loading");
        
        $("#ds_sel, #ds_unsel").css("display", "none");
        
        $("#frm_ds").each( function() {
            $(this).find("input#theDeviceId").attr("value",id);
            this.submit();
        });
    },
    
    textToggle: function(e,a) {
        if ($(ds.open).hasClass("text")) {
            $(a).text("// Viewing TEXT");
            $(ds.open).removeClass("text");
            ds.display(null,[1,8]);
        } else {
            $(a).text("// Viewing THUMBNAILS");
            $(ds.open).addClass("text");
            ds.setTitle(1,ds.devices.length);
        }
    },
    
    sortToggle: function(e,a) {
        if ($(ds.open).hasClass("nameSort")) {
            $(a).text("Sorted By DATE");
            $(ds.open).removeClass("nameSort");
            ds.sort("chrono");
        } else {
            $(a).text("Sorted By NAME");
            $(ds.open).addClass("nameSort");
            ds.sort("alpha");
        }
    },
    sort: function(type) {
        var keyt = (type == "chrono") ? "sortDate" : "sortName";
        var keys = Array();
        $(ds.open).find("ul.devices:first").each( function() {
            var ul = this;
            
            $(this).find("li").each( function() {
                keys.push({key:this.getAttribute(keyt),item:this});
            });
            
            (type == "chrono") ? keys.sort(ds.sortByDESC) : keys.sort(ds.sortBy);
            
            keys = ds.resetLines(keys,1,8);
            
            var cnt = 0;
            $(this).find("li").each( function() {
                $(ul).append(keys[cnt++]["item"]);
            });
            
            ds.display(null,[1,8]);
        });
    },
    sortBy: function(a,b) {
        var x = a.key;
        var y = b.key;
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    },
    sortByDESC: function(a,b) {
        var x = a.key;
        var y = b.key;
        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
    },
    resetLines: function(arr,start,end) {
        var cnt = 0;
        $(arr).each( function() {
            var li = this["item"];
            $(li).removeClass("line");
            if (!(cnt++ % Math.ceil(ds.unit/2))) $(li).addClass("line");
        });
        return arr;
    },
    applyOS: function(os,li) {
        var cos = "";
        switch(os) {
            case "Windows_Mobile_Smartphone":
            case "Windows_Mobile_PocketPC":     cos += "os_win"; break;
            case "RIM":                         cos += "os_rim"; break;
            case "PalmOS":                      cos += "os_plm"; break;
            case "Symbian":                     cos += "os_sym"; break;
            case "Android":                     cos += "os_and"; break;
        }
        if (cos != "") {
            $("<div></div>").addClass("os " + cos).appendTo(li);
        }
    },
    
    setDevice: function(devid) {
        var d = ds.devManu.substring(0,ds.devManu.toLowerCase().indexOf("<span")-1);
        
        $("#add_device_manufacturer").attr("value", d).removeClass("open");
        $("#add_device_model").attr("value", ds.current);
        $("#add_device_modelid").attr("value", devid);
        
        ds.target = "selector";
        // $("#ds_sel").slideDown("fast");
        // $("#ds_unsel").slideUp("fast");
        $("#ds_dev").siblings("h3").click();
        $("#ds_open").find("a.close").click();
	$("#ds_sel,#ds_unsel").removeAttr("style");
    }
}

var tabs = {
    init: function() {
        $(".tabbed").each( function() {
            var tabbed = this;
            $(this).find("ul.tabs").each( function() {
                var ul = this;
                $(this).find("a").each( function() {
                    var view = $(this).attr("target");
                    $(this).attr("target","").attr("href",jsv)
                        .addClass("tab_"+view)
                        .click( function(e) {
                            vis.toggle(e, this, ul);
                            tabs.view(e, tabbed, view);
                    });
                });
            });
        });
        
        tabs.details();
    },
    view: function(e, area, show) {
        $(area).find("div.view").addClass("hidden");
        $("#view_" + show).removeClass("hidden");
    },
    
    details: function() {
        $("a.compatible").attr("href",jsv).click( function() {
            $(".detail_tabs a.tab_compatible").click();
        });
        
        $("a.rate").attr("href",jsv).click( function() {
            $(".detail_tabs a.tab_ratings").click();
            $("#rateToggle").filter(".toggledOff").find("a.btn_toggle").click();
        });
    }
}

var vis = {
    shade: null,
    shadeZ: Array(),
    
    init: function() {
        vis.setHovers();
        vis.setToggles();
        vis.images();
        vis.shade();
        vis.reverseZ();
    },
    
    shade: function() {
        vis.shade = $("<div></div>").attr("id", "shade").addClass("shade")
            .css("height", $(window).height() + "px")
            .appendTo(document.body); 
    },
    toggleShade: function(val) {
        var show = "block";
        if (val > 0) {
            vis.shadeZ.push(val);
        } else {
            val = vis.shadeZ.pop();
            if (vis.shadeZ.length > 0) {
                val = vis.shadeZ[vis.shadeZ.length-1];
            } else {
                show = "none";
            }
        }
        
        $(vis.shade).css("z-index", val).css("display", show);
    },
    
    setHovers: function() {
        var targets = Array();
        targets.push({"element":"ul","class":"tabs","tag":"li"});
        targets.push({"element":"ul","class":"tab_options","tag":"li"});
        targets.push({"element":"div","class":"yuimenu","tag":"h3"});
        
        for (var i=0; i<targets.length; i++) {
            var t_element = targets[i]["element"];
            var t_class   = targets[i]["class"];
            var t_tag     = targets[i]["tag"];
            
            $(t_element + "." + t_class).each( function() {
                $(this).find(t_tag).hover( 
                    function(e) { vis.hover(e, this); },
                    function(e) { vis.hover(e, this); }
                );
            });
        }
    },
    setToggles: function() {
        $(".toggleMe").each( function() {
            var t = this;
            $(this).find("a.btn_toggle:first").each( function() {
                $(this).attr("href",jsv).click( function(e) {
                    vis.revealToggle(e, t);
                });
            });
        });
    },
    revealToggle: function(e,o) {
        if ($(o).hasClass(".toggledOff")) {
            $(o).slideDown(500).removeClass("toggledOff").addClass("toggledOn");
        } else {
            $(o).slideUp(300).removeClass("toggledOn").addClass("toggledOff");
        }
    },
    
    images: function() {
        var im = Array();
        im.push("img/ds_load.gif");
        
        for (var i=0; i<im.length; i++) {
            var n = new Image();
            n.src = im[i];
        }
    },
    
    hover: function(e,o) {
        (e.type == "mouseenter") ? $(o).addClass("hover") : $(o).removeClass("hover");
    },
    toggle: function(e, li, ul) {
        $(ul).find("li").removeClass("current");
        $(li).parent().addClass("current");
    },
    
    getPos: function(owner) {
        if(owner == undefined){
            return {top : 0, left:0 , width : 0, height : 0};
        }

        var e = owner;
        var oTop = e.offsetTop;
        var oLeft = e.offsetLeft;
        var oWidth = e.offsetWidth;
        var oHeight = e.offsetHeight;
        while(e = e.offsetParent) {
            oTop += e.offsetTop;
            oLeft += e.offsetLeft;
        }

        return {
            top : oTop,
            left : oLeft,
            width : oWidth,
            height : oHeight
        }
    },
    isInView: function(elem) {
        var docViewTop = $(window).scrollTop();
        var docViewBottom = docViewTop + $(window).height();

        var elemTop = $(elem).offset().top;
        var elemBottom = elemTop + $(elem).height();

        return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom)
            && (elemBottom <= docViewBottom) &&  (elemTop >= docViewTop) );
    },
    inView: function(elem) {
        var docViewTop = $(window).scrollTop();
        var docViewBottom = docViewTop + $(window).height();

        var elemTop = $(elem).offset().top;
        var elemBottom = elemTop + $(elem).height();

        var current = $(elem).position().top;

        if (elemTop+10 < docViewTop) $(elem).css("top", (current + docViewTop - elemTop + 10) + "px");
        if (elemBottom-10 > docViewBottom) $(elem).css("top", (current + Math.floor(docViewBottom - elemBottom) - 10) + "px");
    },
    
    reverseZ: function() {
        var zIndexNumber = 1000;
        $("div.it").each(function() {
            $(this).parent("li").css("z-index", zIndexNumber);
            $(this).css("z-index", zIndexNumber);
            zIndexNumber -= 10;
        });
    }
}

var drops = {
    init: function() {
        drops.hover();
    },
    
    hover: function() {
        $(".dropdown li")
            .hoverClass("hover")
            .mouseover( function() { $(this).find("ul:first").addClass("hover"); })
            .mouseout( function() { $(this).find("ul:first").removeClass("hover"); })
            
            .hover( function() { 
                $(this).addClass("current")
                    .children("a").addClass("current").end()
                    .children("span.dir").find("a").addClass("current");

                $(this).find("ul:first").each( function() { vis.inView(this); });
            }, function() { 
                $(this).removeClass("current")
                    .find("a").removeClass("current"); 
        });
    }
}

var msg = {
    init: function() {
        msg.help();
        msg.show();
        
        $("<div></div>").attr("id","popup").appendTo("body");
    },
    
    help: function() {
        $(".help .img").hoverClass("hover")
            .toggle( function() {
            $(this).parent().addClass("open").find(".msg").slideDown(600).end()
                .parents("body").find(".help.open .img").not(this).click();
        }, function() {
            $(this).parent().removeClass("open").find(".msg").slideUp(300);
        });
    },
    
    show: function() {
        $(".msg").filter(".msg_open").each( function() {
            if ($(this).css("display") == "none") {
                $(this).fadeTo(600,0.6).slideDown(500).fadeTo(300,1);
            }
        });
        $("input.err_focus, select.err_focus, textarea.err_focus").each( function() {
            var inp = this;
            $(inp).fadeTo(1000,0).siblings("label").fadeTo(1000,0);
            setTimeout( function() {
                $(inp).siblings("label").addClass("err_label");
                $(inp).removeClass("err_focus").wrap("<div class='err_focus'></div>")
                    .before("<div class='icon'>&nbsp;</div>");
                $(inp).blur( function() {
                        if ($(this).attr("value").trim() != "") {
                            $(this).parent().removeClass("err_focus")
                                .siblings(".err_label").removeClass("err_label");
                        }
                    })
                    .fadeTo(1000,1).parent().siblings("label").fadeTo(1000,1);
            }, 2000);
        });
    },
    
    popup: function(title, message) {
        $("#popup").each( function() {
            $(this).empty();
            
            $("<h3>" + title + "</h3>").appendTo(this);
            $("<div class='body'>" + message + "</div>").appendTo(this);
            $("<a></a>").text("OK").attr("href",jsv)
                .addClass("btn").addClass("btn_ok")
                .click( function() {
                    $("#popup").fadeTo(500,0).slideUp(1);
            }).appendTo(this);
            
            $(this).fadeTo(0,0).show().fadeTo(500,1);
        });
        
    }
}

var forms = {
    init: function() {
        forms.hotsync();
        forms.required();
        forms.types();
        
        forms.getit();
    },
    
    hotsync: function() {
        $(".ownerhotsync").each( function() {
            var os = $("#phoneOS").attr("value");
            $(this).find(".row").filter("."+os).removeClass("hidden").show();
            $(this).find(".row").not("."+os).addClass("hidden").hide();
        });
    },
    
    required: function() {
        $(".frm").each( function() {
            var frm = this;
            $(this).find(".btn_save").click( function() {
                var fields = Array();

                $(frm).find(".req").not(".hidden").each( function() {
                    if ($(this).find("input,select").attr("value").trim() == "") {
                        var lbl = $(this).find("label").text().replace(":","").trim();
                        fields.push(lbl);
                    }
                });
                
                if (fields.length > 0) {
                    message = "<p>The following field" + (fields.length > 1 ? "s are" : " is") + " required:</p>\n<ul>";
                    for (var i=0; i<fields.length; i++) {
                        message += "<li>" + fields[i] + "</li>\n";
                    }
                    message += "</ul>\n\n";
                    
                    msg.popup("Required Fields", message);
                    return false;
                }
            });
        });
    },
    
    types: function() {
        $(".frm").each( function() {
            $(this).find("select, input.text, textarea").each( function() {
                $(this).filter(".type_phone").blur( function() { forms.phone(this); });
                
            });
        });
    },
    
    phone: function(p) {
        var pno = $(p).attr("value").trim();
        if (pno != "") {
            var pno = parseInt($(p).attr("value").replace(/[^0-9]/g, ''));
            pno = (String(pno) + "000000000000").substr(0,10);
            pno = "(" + pno.substr(0,3) + ")/" + pno.substr(3,3) + "-" + pno.substr(6,4);
            $(p).attr("value",pno);
        }
    },
    
    getit: function() {
        $(".btn_getit").each( function() {
            var box = $(this).siblings(".getit");
            
            if (box.length > 0) {
                $(this).attr("href",jsv).click( function(e) {
                    if ($(box).css("display") != "block") {
                        $(this).addClass("btn_set");
                        
                        var x = Math.round($(this).position().left) - 4;
                        var y = Math.round($(this).position().top) + 24;
                        $(box).css("top",y+"px").css("left",x+"px").slideDown(500);
                    } else {
                        $(this).removeClass("btn_set");
                        $(box).slideUp(400);
                    }
                });
            }
        });
    }
}

var fold = {
    init: function() {
        $("ul.fold").each( function() {
                $(this).find("li.f > h3").hoverClass("hover").click( function() {
                    var div = $(this).parent();
                    if ($(this).hasClass("open")) {
                        $(div).removeClass("open").find(".ft:first").slideUp().siblings("h3").removeClass("open")
                            .parents("ul.fold").removeClass("foldopen").find("> li.open").parents("ul.fold").addClass("foldopen");
                    } else {
                        $(div).addClass("open").find("h3:first").addClass("open").siblings(".ft").slideDown()
                            .parents("ul.fold").addClass("foldopen");
                        $(div).siblings("li.open").find("h3:first").click();
                    }
                });
        });
    }
}


var page = {
    init: function() {
        page.resetOSClasses();
        //page.balanceHome();
    },
    
    resetOSClasses: function() {
        var oses = [ { "newcls" : "plm", "olds" : [ "palmProduct", "PalmOS" ] },
            { "newcls" : "win", "olds" : [ "Windows_Mobile_PocketPC", "Windows_Mobile_Smartphone", "pocketpc", "smartphone" ] },
            { "newcls" : "rim", "olds" : [ "RIM", "blackberry" ] } ];
        for (var i = 0; i < oses.length; i++) {
            var newcls = "os_" + oses[i].newcls;

            for (var j = 0; j < oses[i].olds.length; j++) {
                var oldcls = "os_" + oses[i].olds[j];
                $("." + oldcls).each( function() {
                    $(this).removeClass(oldcls).addClass(newcls);
                });
            }
        }
    },
    
    balanceHome: function() {
        var maxh = 0;
        $("#bd.home").find(".row3").find(".view").each( function() {
            if ($(this).height() > maxh) {
                maxh = $(this).height();
            }
        }).each( function() {
            $(this).height(maxh).find(".bottom").css( { "position" : "absolute", "bottom" : "7px", "right" : "4px" } );
        });
    }
}

function setFocus(elementId) 
{ 
	var e = document.getElementById(elementId);
	if (e) if (e.getAttribute("type") != "hidden") e.focus();
}

$(document).ready( function() {
    vis.init();
    page.init();
    
    ds.init();
    msg.init();
    forms.init();
    fold.init();
    
    drops.init();
});

$(window).load( function() {
    tabs.init();
});
