/*
		Timer by Algorithm
		http://www.codingforums.com/archive/index.php/t-10531.html
	*/
	function Timer(){
		this.obj = (arguments.length)?arguments[0]:window;
		return this;
	}
	
	// The set functions should be called with:
	// - The name of the object method (as a string) (required)
	// - The millisecond delay (required)
	// - Any number of extra arguments, which will all be
	// passed to the method when it is evaluated.
	
	Timer.prototype.setInterval = function(func, msec){
		var i = Timer.getNew();
		var t = Timer.buildCall(this.obj, i, arguments);
		Timer.set[i].timer = window.setInterval(t,msec);
		return i;
	}
	Timer.prototype.setTimeout = function(func, msec){
		var i = Timer.getNew();
		Timer.buildCall(this.obj, i, arguments);
		Timer.set[i].timer = window.setTimeout("Timer.callOnce("+i+");",msec);
		return i;
	}
	
	// The clear functions should be called with
	// the return value from the equivalent set function.
	Timer.prototype.clearInterval = function(i){
		if(!Timer.set[i]) return;
		window.clearInterval(Timer.set[i].timer);
		Timer.set[i] = null;
	}
	Timer.prototype.clearTimeout = function(i){
		if(!Timer.set[i]) return;
		window.clearTimeout(Timer.set[i].timer);
		Timer.set[i] = null;
	}
	
	// Private data
	Timer.set = new Array();
	Timer.buildCall = function(obj, i, args){
		var t = "";
		Timer.set[i] = new Array();
		if(obj != window){
			Timer.set[i].obj = obj;
			t = "Timer.set["+i+"].obj.";
		}
		t += args[0]+"(";
		if(args.length > 2){
			Timer.set[i][0] = args[2];
			t += "Timer.set["+i+"][0]";
			for(var j=1; (j+2)<args.length; j++){
				Timer.set[i][j] = args[j+2];
				t += ", Timer.set["+i+"]["+j+"]";
			}
		}
		t += ");";
		Timer.set[i].call = t;
		return t;
	}
	Timer.callOnce = function(i){
		if(!Timer.set[i]) return;
		eval(Timer.set[i].call);
		Timer.set[i] = null;
	}
	Timer.getNew = function(){
		var i = 0;
		while(Timer.set[i]) i++;
		return i;
	}

function PageLocator(propertyToUse, dividingCharacter) {
    this.propertyToUse = propertyToUse;
    this.defaultQS = 'none';
    this.dividingCharacter = dividingCharacter;
}

PageLocator.prototype.getLocation = function() {
    try {
        return eval(this.propertyToUse);
    }catch(e){return this.defaultQS;}
}

PageLocator.prototype.getHash = function() {
    var url = this.getLocation();
    if(url.indexOf(this.dividingCharacter)>-1) {
        var url_elements = url.split(this.dividingCharacter);
        return unescape(url_elements[url_elements.length-1]);
    } else {
        return this.defaultQS;
    }
}

PageLocator.prototype.getHref = function() {
    var url = this.getLocation();
    var url_elements = url.split(this.dividingCharacter)
    return url_elements[0];
}

PageLocator.prototype.makeNewLocation = function(new_qs) {
    return this.getHref() + this.dividingCharacter + new_qs;
}



function AjaxIframesFixer(iframeid) {
    this.iframeid = iframeid;
    if (document.getElementById(iframeid)) {
        this.locator = new PageLocator("document.frames['"+iframeid+"'].getLocation()", "?hash=");
        this.windowlocator = new PageLocator("window.location.href", "#");
        this.timer = new Timer(this);
        this.delayInit(); // required or IE doesn't fire
    }
}

AjaxIframesFixer.prototype.delayInit = function(){
    this.timer.setTimeout("checkWhetherChanged", 1000);
}

AjaxIframesFixer.prototype.pause = function(){
    this.paused = true;
}

AjaxIframesFixer.prototype.resume = function(){
    this.paused = false;
}

AjaxIframesFixer.prototype.checkWhetherChanged = function(){
    var winHash    = this.windowlocator.getHash();
    var iframeHash = this.locator.getHash();
    if(iframeHash != 'none' && iframeHash != winHash && !this.paused) {
        loadPage(iframeHash, iframeHash.indexOf("MyHomePage")>-1 ? 'hpdiv' :'contentDiv', true, null, this.timer);
    }
    else {
        this.timer.setTimeout("checkWhetherChanged", 750);
    }
}



function AjaxUrlFixer() {
    this.locator = new PageLocator("window.location.href", "#");
    this.locator2 = new PageLocator("document.getElementById('location').value", "?hash=");
    this.timer = new Timer(this);
    this.checkWhetherChanged('none');
}

AjaxUrlFixer.prototype.checkWhetherChanged = function(){
    var winHash     = this.locator.getHash();
    var contentHash = this.locator2.getHash();
    if(contentHash != 'none' && winHash != 'none' && contentHash != winHash && isNaN(winHash)) {
        loadPage(winHash, winHash.indexOf("MyHomePage")>-1 ? 'hpdiv' :'contentDiv', true, null, this.timer);
    }
    else {
        this.timer.setTimeout("checkWhetherChanged", 750);
    }
}
